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 }