using Newtonsoft.Json.Converters;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using System.Collections.Generic;
public static async Task Main()
Console.WriteLine(JsonSchema.FromType(typeof(ModuleAssemblyMetadata)).ToJson());
[JsonConverter(typeof(StringEnumConverter))]
public enum ModuleLanguage
public class ParameterMetadata
[JsonProperty("name", Required = Required.Always )]
public string Name { get; set; }
[JsonProperty("type", Required = Required.Always)]
public string Type { get; set; }
[JsonProperty("description", NullValueHandling = NullValueHandling.Ignore )]
public string Description { get; set; }
[JsonProperty("descriptionFile", NullValueHandling = NullValueHandling.Ignore )]
public string DescriptionFile { get; set; }
[JsonProperty("converter", NullValueHandling = NullValueHandling.Ignore )]
public string Converter { get; set; }
public class QuestionModuleMetadata
[JsonProperty("name", Required = Required.Always )]
public string Name { get; set; }
[JsonProperty("class", Required = Required.Always )]
public string Class { get; set; }
[JsonProperty("namespace", Required = Required.Always )]
public string Namespace { get; set; }
[JsonProperty("description", NullValueHandling = NullValueHandling.Ignore )]
public string Description { get; set; }
[JsonProperty("descriptionFile", NullValueHandling = NullValueHandling.Ignore )]
public string DescriptionFile { get; set; }
[JsonProperty("language", Required = Required.Always, DefaultValueHandling = DefaultValueHandling.Populate)]
[DefaultValue(typeof(ModuleLanguage), "Markdown")]
public ModuleLanguage Language { get; set; } = ModuleLanguage.Markdown;
[JsonProperty("parameters", NullValueHandling = NullValueHandling.Ignore)]
public List<ParameterMetadata> Parameters { get; set; }
public class ExamModuleMetadata
[JsonProperty("name", Required = Required.Always )]
public string Name { get; set; } = "";
[JsonProperty("class", Required = Required.Always )]
public string Class { get; set; } = "";
[JsonProperty("namespace", Required = Required.Always)]
public string Namespace { get; set; } = "";
[JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)]
public string Description { get; set; }
[JsonProperty("css", NullValueHandling = NullValueHandling.Ignore)]
public List<string> Css { get; set; }
[JsonProperty("js", NullValueHandling = NullValueHandling.Ignore)]
public List<string> Js { get; set; }
[JsonProperty("descriptionFile", NullValueHandling = NullValueHandling.Ignore)]
public string DescriptionFile { get; set; }
[JsonProperty("parameters", NullValueHandling = NullValueHandling.Ignore)]
public List<ParameterMetadata> Parameters { get; set; }
public class ModuleAssemblyMetadata
[JsonProperty("assembly", Required = Required.Always)]
public string Assembly { get; set; } = "";
[JsonProperty("author", NullValueHandling = NullValueHandling.Ignore)]
public string Author { get; set; } = "";
[JsonProperty("version", Required = Required.Always)]
public Version Version { get; set; } = null;
[JsonProperty("exams", NullValueHandling = NullValueHandling.Ignore)]
public List<ExamModuleMetadata> ExamModules { get; set; }
[JsonProperty("questions", NullValueHandling = NullValueHandling.Ignore)]
public List<QuestionModuleMetadata> QuestionModules { get; set; }