@@ -164,35 +164,44 @@ defmodule JS2E.Printers.ObjectPrinter do
164
164
165
165
decoder_name = print_decoder_name ( property_type )
166
166
167
+ is_required = property_name in required
168
+
167
169
cond do
168
- union_type? ( property_type ) ->
169
- print_custom_clause ( property_name , decoder_name )
170
+ union_type? ( property_type ) || one_of_type? ( property_type ) ->
171
+ print_union_clause ( property_name , decoder_name , is_required )
172
+
173
+ enum_type? ( property_type ) ->
174
+ property_type_decoder =
175
+ property_type . type
176
+ |> determine_primitive_type_decoder ( )
170
177
171
- property_name in required ->
172
- print_required_clause ( property_name , decoder_name )
178
+ print_enum_clause ( property_name , property_type_decoder ,
179
+ decoder_name , is_required )
173
180
174
181
true ->
175
- print_optional_clause ( property_name , decoder_name )
182
+ print_normal_clause ( property_name , decoder_name , is_required )
176
183
end
177
184
end
178
185
179
- @ spec print_decoder_name ( Types . typeDefinition ) :: String . t
180
- defp print_decoder_name ( property_type ) do
186
+ @ spec determine_primitive_type_decoder ( String . t ) :: String . t
187
+ defp determine_primitive_type_decoder ( property_type_value ) do
188
+ case property_type_value do
189
+ "integer" ->
190
+ "int"
181
191
182
- if primitive_type? ( property_type ) do
183
- property_type_value = property_type . type
184
-
185
- case property_type_value do
186
- "integer" ->
187
- "int"
192
+ "number" ->
193
+ "float"
188
194
189
- "number" ->
190
- "float"
195
+ _ ->
196
+ property_type_value
197
+ end
198
+ end
191
199
192
- _ ->
193
- property_type_value
194
- end
200
+ @ spec print_decoder_name ( Types . typeDefinition ) :: String . t
201
+ defp print_decoder_name ( property_type ) do
195
202
203
+ if primitive_type? ( property_type ) do
204
+ determine_primitive_type_decoder ( property_type . type )
196
205
else
197
206
198
207
property_type_name = property_type . name
@@ -209,26 +218,62 @@ defmodule JS2E.Printers.ObjectPrinter do
209
218
Util . get_string_name ( type ) == "PrimitiveType"
210
219
end
211
220
221
+ defp enum_type? ( type ) do
222
+ Util . get_string_name ( type ) == "EnumType"
223
+ end
224
+
225
+ defp one_of_type? ( type ) do
226
+ Util . get_string_name ( type ) == "OneOfType"
227
+ end
228
+
212
229
defp union_type? ( type ) do
213
230
Util . get_string_name ( type ) == "UnionType"
214
231
end
215
232
216
- defp print_custom_clause ( property_name , decoder_name ) do
233
+ defp print_union_clause ( property_name , decoder_name , is_required ) do
217
234
double_indent = Util . indent ( 2 )
218
- "#{ double_indent } |> " <>
219
- "custom (field \" #{ property_name } \" #{ decoder_name } )"
235
+
236
+ if is_required do
237
+ "#{ double_indent } |> " <>
238
+ "required \" #{ property_name } \" #{ decoder_name } "
239
+
240
+ else
241
+ "#{ double_indent } |> " <>
242
+ "optional \" #{ property_name } \" (nullable #{ decoder_name } ) Nothing"
243
+ end
220
244
end
221
245
222
- defp print_required_clause ( property_name , decoder_name ) do
246
+ defp print_enum_clause (
247
+ property_name ,
248
+ property_type_decoder ,
249
+ decoder_name ,
250
+ is_required ) do
251
+
223
252
double_indent = Util . indent ( 2 )
224
- "#{ double_indent } |> " <>
225
- "required \" #{ property_name } \" #{ decoder_name } "
253
+
254
+ if is_required do
255
+ "#{ double_indent } |> " <>
256
+ "required \" #{ property_name } \" (#{ property_type_decoder } |> " <>
257
+ "andThen #{ decoder_name } )"
258
+
259
+ else
260
+ "#{ double_indent } |> " <>
261
+ "optional \" #{ property_name } \" (#{ property_type_decoder } |> " <>
262
+ "andThen #{ decoder_name } |> maybe) Nothing"
263
+ end
226
264
end
227
265
228
- defp print_optional_clause ( property_name , decoder_name ) do
266
+ defp print_normal_clause ( property_name , decoder_name , is_required ) do
229
267
double_indent = Util . indent ( 2 )
230
- "#{ double_indent } |> " <>
231
- "optional \" #{ property_name } \" (nullable #{ decoder_name } ) Nothing"
268
+
269
+ if is_required do
270
+ "#{ double_indent } |> " <>
271
+ "required \" #{ property_name } \" #{ decoder_name } "
272
+
273
+ else
274
+ "#{ double_indent } |> " <>
275
+ "optional \" #{ property_name } \" (nullable #{ decoder_name } ) Nothing"
276
+ end
232
277
end
233
278
234
279
end
0 commit comments