1 module jsonschema.standard.keyword; 2 3 import std, jsonschema; 4 5 struct JsonSchemaTypeKeyword(SchemaT) 6 { 7 static: 8 9 immutable KEYWORD = "type"; 10 11 void handle(ref SchemaT schema, SchemaT.Adapter.AggregateType value) 12 { 13 schemaEnforceType(JsonSchemaType.string_, SchemaT.Adapter.getType(value)); 14 15 const type = SchemaT.Adapter.getString(value); 16 switch(type) with(JsonSchemaType) 17 { 18 case "string": schema.common.type = string_; break; 19 case "number": schema.common.type = number; break; 20 case "object": schema.common.type = object; break; 21 case "array": schema.common.type = array; break; 22 case "boolean": schema.common.type = boolean; break; 23 case "integer": schema.common.type = integer; break; 24 case "null": schema.common.type = null_; break; 25 26 default: throw new Exception("Unknown type: '"~type~"'"); 27 } 28 } 29 } 30 31 struct JsonSchemaPropertiesKeyword(SchemaT) 32 { 33 static: 34 35 immutable KEYWORD = "properties"; 36 37 void handle(ref SchemaT schema, SchemaT.Adapter.AggregateType value) 38 { 39 const valueType = SchemaT.Adapter.getType(value); 40 schemaEnforceType(JsonSchemaType.object, valueType); 41 42 SchemaT.Adapter.eachObjectProperty(value, (k,v) 43 { 44 JsonSchemaProperty!SchemaT prop; 45 prop.name = k; 46 prop.schema.parse(v); 47 schema.object.properties ~= prop; 48 }); 49 } 50 } 51 52 struct JsonSchemaPatternPropertiesKeyword(SchemaT) 53 { 54 static: 55 56 immutable KEYWORD = "patternProperties"; 57 58 void handle(ref SchemaT schema, SchemaT.Adapter.AggregateType value) 59 { 60 const valueType = SchemaT.Adapter.getType(value); 61 schemaEnforceType(JsonSchemaType.object, valueType); 62 63 SchemaT.Adapter.eachObjectProperty(value, (k,v) 64 { 65 JsonSchemaPatternProperty!SchemaT prop; 66 prop.pattern = k.regex; 67 prop.schema.parse(v); 68 schema.object.patternProperties ~= prop; 69 }); 70 } 71 } 72 73 struct JsonSchemaAdditionalPropertiesKeyword(SchemaT) 74 { 75 static: 76 77 immutable KEYWORD = "additionalProperties"; 78 79 void handle(ref SchemaT schema, SchemaT.Adapter.AggregateType value) 80 { 81 const valueType = SchemaT.Adapter.getType(value); 82 schemaEnforceType(JsonSchemaType.boolean, valueType); 83 schema.object.additionalProperties = new SchemaT(); 84 schema.object.additionalProperties.parse(value); 85 } 86 }