@@ -9,7 +9,8 @@ This project requires that you already have [elixir](http://elixir-lang.org/)
9
9
and its build tool ` mix ` installed, this can be done with ` brew install elixir `
10
10
or similar.
11
11
12
- - Clone this repository:
` git clone [email protected] :dragonwasrobot/json-schema-to-elm.git `
12
+ - Clone this repository: `git clone
13
+ [email protected] : dragonwasrobot /json-schema-to-elm.git`
13
14
- Build an executable: ` MIX_ENV=prod mix build `
14
15
- An executable, ` js2e ` , has now been created in your current working directory.
15
16
@@ -22,3 +23,159 @@ works is still in progress, but feel free to take a look at the `examples`
22
23
folder which contains an example of a pair of JSON schemas and their
23
24
corresponding Elm output. Likewise, representations of each of the different
24
25
JSON schema types are described in the ` lib/types ` folder.
26
+
27
+ ## Example
28
+
29
+ If we supply ` js2e ` with the following JSON schema file, ` definitions.json ` :
30
+ ``` json
31
+ {
32
+ "$schema" : " http://json-schema.org/draft-04/schema" ,
33
+ "title" : " Definitions" ,
34
+ "id" : " http://example.com/definitions.json" ,
35
+ "description" : " Schema for common types" ,
36
+ "definitions" : {
37
+ "color" : {
38
+ "id" : " #color" ,
39
+ "type" : " string" ,
40
+ "enum" : [ " red" , " yellow" , " green" , " blue" ]
41
+ },
42
+ "point" : {
43
+ "id" : " #point" ,
44
+ "type" : " object" ,
45
+ "properties" : {
46
+ "x" : {
47
+ "type" : " number"
48
+ },
49
+ "y" : {
50
+ "type" : " number"
51
+ }
52
+ },
53
+ "required" : [ " x" , " y" ]
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ it produces the following Elm file, ` Domain/Definitions.elm ` :
60
+
61
+ ``` elm
62
+ module Domain.Definitions exposing (..)
63
+
64
+ -- Schema for common types
65
+
66
+ import Json.Decode as Decode
67
+ exposing
68
+ ( float
69
+ , int
70
+ , string
71
+ , list
72
+ , succeed
73
+ , fail
74
+ , map
75
+ , maybe
76
+ , field
77
+ , at
78
+ , andThen
79
+ , oneOf
80
+ , nullable
81
+ , Decoder
82
+ )
83
+ import Json.Decode.Pipeline
84
+ exposing
85
+ ( decode
86
+ , required
87
+ , optional
88
+ , custom
89
+ )
90
+ import Json.Encode as Encode
91
+ exposing
92
+ ( Value
93
+ , float
94
+ , int
95
+ , string
96
+ , list
97
+ , object
98
+ )
99
+
100
+
101
+ type Color
102
+ = Red
103
+ | Yellow
104
+ | Green
105
+ | Blue
106
+
107
+
108
+ type alias Point =
109
+ { x : Float
110
+ , y : Float
111
+ }
112
+
113
+
114
+ colorDecoder : String -> Decoder Color
115
+ colorDecoder color =
116
+ case color of
117
+ " red" ->
118
+ succeed Red
119
+
120
+ " yellow" ->
121
+ succeed Yellow
122
+
123
+ " green" ->
124
+ succeed Green
125
+
126
+ " blue" ->
127
+ succeed Blue
128
+
129
+ _ ->
130
+ fail <| " Unknown color type: " ++ color
131
+
132
+
133
+ pointDecoder : Decoder Point
134
+ pointDecoder =
135
+ decode Point
136
+ |> required " x" Decode . float
137
+ |> required " y" Decode . float
138
+
139
+
140
+ encodeColor : Color -> Value
141
+ encodeColor color =
142
+ case color of
143
+ Red ->
144
+ Encode . string " red"
145
+
146
+ Yellow ->
147
+ Encode . string " yellow"
148
+
149
+ Green ->
150
+ Encode . string " green"
151
+
152
+ Blue ->
153
+ Encode . string " blue"
154
+
155
+
156
+ encodePoint : Point -> Value
157
+ encodePoint point =
158
+ let
159
+ x =
160
+ [ ( " x" , Encode . float point. x ) ]
161
+
162
+ y =
163
+ [ ( " y" , Encode . float point. y ) ]
164
+ in
165
+ object <|
166
+ x
167
+ ++ y
168
+ ```
169
+
170
+ which contains an Elm type for the ` color ` and ` point ` definitions along with
171
+ their corresponding JSON decoders and encoders.
172
+
173
+ Furthermore, if we supply ` js2e ` with another JSON schema file that references
174
+ any of the definitions in ` definitions.json ` , e.g.
175
+
176
+ ``` json
177
+ { "$ref" : " http://example.com/definitions.json#point" }
178
+ ```
179
+
180
+ then the corresponding Elm file output will import the definitions ` Point ` ,
181
+ ` pointDecoder ` and ` encodePoint ` from ` Domain.Definitions ` .
0 commit comments