public static JsonSchema4 BuildJsonSchema(this Schema schema, PartitionResolver partitionResolver, Func <string, JsonSchema4, JsonSchema4> schemaResolver) { Guard.NotNull(schemaResolver, nameof(schemaResolver)); Guard.NotNull(partitionResolver, nameof(partitionResolver)); var schemaName = schema.Name.ToPascalCase(); var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver); var jsonSchema = new JsonSchema4 { Type = JsonObjectType.Object }; foreach (var field in schema.Fields.Where(x => !x.IsHidden)) { var partitionProperty = CreateProperty(field); var partitionObject = new JsonSchema4 { Type = JsonObjectType.Object, AllowAdditionalProperties = false }; var partition = partitionResolver(field.Partitioning); foreach (var partitionItem in partition) { var partitionItemProperty = field.Accept(jsonTypeVisitor); partitionItemProperty.Description = partitionItem.Name; partitionObject.Properties.Add(partitionItem.Key, partitionItemProperty); } partitionProperty.Reference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}Property", partitionObject); jsonSchema.Properties.Add(field.Name, partitionProperty); } return(jsonSchema); }
public static JsonSchema BuildJsonSchema(this Schema schema, PartitionResolver partitionResolver, SchemaResolver schemaResolver, bool withHidden = false) { Guard.NotNull(schemaResolver, nameof(schemaResolver)); Guard.NotNull(partitionResolver, nameof(partitionResolver)); var schemaName = schema.Name.ToPascalCase(); var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver, withHidden); var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi(withHidden)) { var partitionObject = SchemaBuilder.Object(); var partitioning = partitionResolver(field.Partitioning); foreach (var partitionKey in partitioning.AllKeys) { var partitionItemProperty = field.Accept(jsonTypeVisitor); if (partitionItemProperty != null) { var isOptional = partitioning.IsOptional(partitionKey); var name = partitioning.GetName(partitionKey); partitionItemProperty.Description = name; partitionItemProperty.SetRequired(field.RawProperties.IsRequired && !isOptional); partitionObject.Properties.Add(partitionKey, partitionItemProperty); } } if (partitionObject.Properties.Count > 0) { var propertyReference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}Property", partitionObject); jsonSchema.Properties.Add(field.Name, CreateProperty(field, propertyReference)); } } return(jsonSchema); }
public static JsonSchema4 BuildJsonSchema(this Schema schema, PartitionResolver partitionResolver, Func <string, JsonSchema4, JsonSchema4> schemaResolver) { Guard.NotNull(schemaResolver, nameof(schemaResolver)); Guard.NotNull(partitionResolver, nameof(partitionResolver)); var schemaName = schema.Name.ToPascalCase(); var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver); var jsonSchema = new JsonSchema4 { Type = JsonObjectType.Object }; foreach (var field in schema.Fields.ForApi()) { var partitionObject = Builder.Object(); var partition = partitionResolver(field.Partitioning); foreach (var partitionItem in partition) { var partitionItemProperty = field.Accept(jsonTypeVisitor); if (partitionItemProperty != null) { partitionItemProperty.Description = partitionItem.Name; partitionItemProperty.IsRequired = field.RawProperties.IsRequired && !partitionItem.IsOptional; partitionObject.Properties.Add(partitionItem.Key, partitionItemProperty); } } if (partitionObject.Properties.Count > 0) { var propertyReference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}Property", partitionObject); jsonSchema.Properties.Add(field.Name, CreateProperty(field, propertyReference)); } } return(jsonSchema); }
public static JsonSchema BuildFlatJsonSchema(this Schema schema, SchemaResolver schemaResolver) { Guard.NotNull(schemaResolver, nameof(schemaResolver)); var schemaName = schema.TypeName(); var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi()) { var property = JsonTypeVisitor.BuildProperty(field, null, false); if (property != null) { var propertyReference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}FlatPropertyDto", () => property); jsonSchema.Properties.Add(field.Name, CreateProperty(field, propertyReference)); } } return(jsonSchema); }
public static JsonSchema BuildDynamicJsonSchema(this Schema schema, SchemaResolver schemaResolver, bool withHidden = false) { Guard.NotNull(schemaResolver, nameof(schemaResolver)); var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi(withHidden)) { var propertyItem = JsonTypeVisitor.BuildProperty(field, null, withHidden); if (propertyItem != null) { var property = SchemaBuilder.ObjectProperty(propertyItem) .SetDescription(field) .SetRequired(field.RawProperties.IsRequired); jsonSchema.Properties.Add(field.Name, property); } } return(jsonSchema); }
public static JsonSchema BuildJsonSchema(this Schema schema, PartitionResolver partitionResolver, bool withHidden = false) { Guard.NotNull(partitionResolver, nameof(partitionResolver)); var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi(withHidden)) { var propertyObject = SchemaBuilder.Object(); var partitioning = partitionResolver(field.Partitioning); foreach (var partitionKey in partitioning.AllKeys) { var propertyItem = JsonTypeVisitor.BuildProperty(field, null, withHidden); if (propertyItem != null) { var isOptional = partitioning.IsOptional(partitionKey); var name = partitioning.GetName(partitionKey); propertyItem.SetDescription(name); propertyItem.SetRequired(field.RawProperties.IsRequired && !isOptional); propertyObject.Properties.Add(partitionKey, propertyItem); } } if (propertyObject.Properties.Count > 0) { jsonSchema.Properties.Add(field.Name, CreateProperty(field, propertyObject)); } } return(jsonSchema); }