1 module route;
2 
3 import boilerplate;
4 import std.json;
5 import std.typecons;
6 import text.json.Decode;
7 import ToJson;
8 import types;
9 
10 struct Route
11 {
12     string url;
13 
14     string method;
15 
16     string description;
17 
18     string operationId;
19 
20     Type schema;
21 
22     Parameter[] parameters;
23 
24     Response[] responses;
25 
26     mixin(GenerateAll);
27 }
28 
29 abstract class Parameter
30 {
31     mixin(GenerateAll);
32 }
33 
34 class ValueParameter : Parameter
35 {
36     string in_;
37 
38     @(This.Default!null)
39     string description;
40 
41     string name;
42 
43     Type schema;
44 
45     @(This.Default)
46     Nullable!bool required;
47 
48     mixin(GenerateAll);
49 }
50 
51 class RefParameter : Parameter
52 {
53     string target;
54 
55     mixin(GenerateAll);
56 }
57 
58 struct Response
59 {
60     string code;
61 
62     @(This.Default!null)
63     Type schema;
64 
65     mixin(GenerateAll);
66 }
67 
68 Parameter decode(T : Parameter)(const JSONValue value)
69 in (value.type == JSONType.array)
70 {
71     if (value.hasKey("$ref"))
72     {
73         return new RefParameter(value.getEntry("$ref").decodeJson!string);
74     }
75     return value.toObject.decodeJson!(ValueParameter, types.decode);
76 }
77 
78 private alias _ = decode!Parameter;