65
65
jsone :incomplete () |
66
66
{error , {Reason :: term (), [jsone :stack_item ()]}}.
67
67
68
- -record (decode_opt_v3 ,
69
- {object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
70
- allow_ctrl_chars = false :: boolean (),
71
- reject_invalid_utf8 = false :: boolean (),
72
- keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
73
- undefined_as_null = false :: boolean (),
74
- duplicate_map_keys = first :: first | last ,
75
- stream = false :: boolean ()}).
68
+ -record (decode_opt_v3 , {
69
+ object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
70
+ allow_ctrl_chars = false :: boolean (),
71
+ reject_invalid_utf8 = false :: boolean (),
72
+ keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
73
+ undefined_as_null = false :: boolean (),
74
+ duplicate_map_keys = first :: first | last ,
75
+ stream = false :: boolean ()
76
+ }).
76
77
-define (OPT , # decode_opt_v3 ).
78
+
77
79
-type opt() :: #decode_opt_v3{}.
78
80
81
+
79
82
% %--------------------------------------------------------------------------------
80
83
% % Exported Functions
81
84
% %--------------------------------------------------------------------------------
82
85
- spec decode (binary ()) -> decode_result ().
83
86
decode (Json ) ->
84
87
decode (Json , []).
85
88
89
+
86
90
- spec decode (binary (), [jsone :decode_option ()]) -> decode_result ().
87
91
decode (<<Json /binary >>, Options ) ->
88
92
Opt = parse_options (Options ),
@@ -93,6 +97,7 @@ decode(<<Json/binary>>, Options) ->
93
97
Result
94
98
end .
95
99
100
+
96
101
% %--------------------------------------------------------------------------------
97
102
% % Internal Functions
98
103
% %--------------------------------------------------------------------------------
@@ -110,6 +115,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
110
115
whitespace (Bin , {object_next , [{Key , Value } | Members ]}, Nexts , Buf , Opt )
111
116
end .
112
117
118
+
113
119
- spec whitespace (binary (), whitespace_next (), [next ()], binary (), opt ()) -> decode_result ().
114
120
whitespace (<<$ , Bin /binary >>, Next , Nexts , Buf , Opt ) ->
115
121
whitespace (Bin , Next , Nexts , Buf , Opt );
@@ -139,6 +145,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
139
145
object_next (Bin , Members , Nexts , Buf , Opt )
140
146
end .
141
147
148
+
142
149
- spec value (binary (), [next ()], binary (), opt ()) -> decode_result ().
143
150
value (<<" false" , Bin /binary >>, Nexts , Buf , Opt ) ->
144
151
next (Bin , false , Nexts , Buf , Opt );
@@ -165,6 +172,7 @@ value(<<C, _/binary>> = Bin, Nexts, Buf, Opt) when
165
172
value (<<Bin /binary >>, Nexts , Buf , Opt ) ->
166
173
number (Bin , Nexts , Buf , Opt ).
167
174
175
+
168
176
- spec array (binary (), [next ()], binary (), opt ()) -> decode_result ().
169
177
array (<<$] , Bin /binary >>, Nexts , Buf , Opt ) ->
170
178
next (Bin , [], Nexts , Buf , Opt );
@@ -173,6 +181,7 @@ array(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
173
181
array (<<Bin /binary >>, Nexts , Buf , Opt ) ->
174
182
value (Bin , [{array_next , []} | Nexts ], Buf , Opt ).
175
183
184
+
176
185
- spec array_next (binary (), [jsone :json_value ()], [next ()], binary (), opt ()) -> decode_result ().
177
186
array_next (<<$] , Bin /binary >>, Values , Nexts , Buf , Opt ) ->
178
187
next (Bin , lists :reverse (Values ), Nexts , Buf , Opt );
@@ -183,6 +192,7 @@ array_next(<<>>, Values, Nexts, Buf, Opt) when Opt?OPT.stream ->
183
192
array_next (Bin , Values , Nexts , Buf , Opt ) ->
184
193
? ERROR (array_next , [Bin , Values , Nexts , Buf , Opt ]).
185
194
195
+
186
196
- spec object (binary (), [next ()], binary (), opt ()) -> decode_result ().
187
197
object (<<$} , Bin /binary >>, Nexts , Buf , Opt ) ->
188
198
next (Bin , make_object ([], Opt ), Nexts , Buf , Opt );
@@ -191,6 +201,7 @@ object(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
191
201
object (<<Bin /binary >>, Nexts , Buf , Opt ) ->
192
202
object_key (Bin , [], Nexts , Buf , Opt ).
193
203
204
+
194
205
- spec object_key (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
195
206
object_key (<<$" , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
196
207
string (Bin , byte_size (Buf ), [{object_value , Members } | Nexts ], Buf , Opt );
@@ -199,6 +210,7 @@ object_key(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
199
210
object_key (<<Bin /binary >>, Members , Nexts , Buf , Opt ) ->
200
211
? ERROR (object_key , [Bin , Members , Nexts , Buf , Opt ]).
201
212
213
+
202
214
- spec object_value (binary (), jsone :json_string (), jsone :json_object_members (), [next ()], binary (), opt ()) ->
203
215
decode_result ().
204
216
object_value (<<$: , Bin /binary >>, Key , Members , Nexts , Buf , Opt ) ->
@@ -209,6 +221,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
209
221
? ERROR (object_value , [Bin , Key , Members , Nexts , Buf , Opt ]).
210
222
211
223
- compile ({inline , [object_key / 2 ]}).
224
+
225
+
212
226
object_key (Key , ? OPT {keys = binary }) ->
213
227
Key ;
214
228
object_key (Key , ? OPT {keys = atom }) ->
@@ -223,6 +237,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
223
237
Key
224
238
end .
225
239
240
+
226
241
- spec object_next (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
227
242
object_next (<<$} , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
228
243
next (Bin , make_object (Members , Opt ), Nexts , Buf , Opt );
@@ -233,10 +248,12 @@ object_next(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
233
248
object_next (Bin , Members , Nexts , Buf , Opt ) ->
234
249
? ERROR (object_next , [Bin , Members , Nexts , Buf , Opt ]).
235
250
251
+
236
252
- spec string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
237
253
string (<<Bin /binary >>, Start , Nexts , Buf , Opt ) ->
238
254
string (Bin , Bin , Start , Nexts , Buf , Opt ).
239
255
256
+
240
257
- spec string (binary (), binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
241
258
string (<<$" , Bin /binary >>, Base , Start , Nexts , Buf , Opt ) ->
242
259
Prefix = binary :part (Base , 0 , byte_size (Base ) - byte_size (Bin ) - 1 ),
@@ -293,6 +310,7 @@ string(<<>>, Base, Start, Nexts, Buf, Opt) when Opt?OPT.stream ->
293
310
string (Bin , Base , Start , Nexts , Buf , Opt ) ->
294
311
? ERROR (string , [Bin , Base , Start , Nexts , Buf , Opt ]).
295
312
313
+
296
314
- spec unicode_string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
297
315
unicode_string (<<N :4 /binary , Bin /binary >> = Bin0 , Start , Nexts , Buf , Opt ) ->
298
316
try
@@ -337,12 +355,14 @@ unicode_string(Bin, Start, Nexts, Buf, Opt) when byte_size(Bin) < 4, Opt?OPT.str
337
355
unicode_string (Bin , Start , Nexts , Buf , Opt ) ->
338
356
? ERROR (unicode_string , [Bin , Start , Nexts , Buf , Opt ]).
339
357
358
+
340
359
- spec number (binary (), [next ()], binary (), opt ()) -> decode_result ().
341
360
number (<<$- , Bin /binary >>, Nexts , Buf , Opt ) ->
342
361
number_integer_part (Bin , - 1 , Nexts , Buf , Opt );
343
362
number (<<Bin /binary >>, Nexts , Buf , Opt ) ->
344
363
number_integer_part (Bin , 1 , Nexts , Buf , Opt ).
345
364
365
+
346
366
- spec number_integer_part (binary (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
347
367
number_integer_part (<<$0 >>, Sign , Nexts , Buf , Opt ) when Opt ? OPT .stream ->
348
368
incomplete (fun number_fraction_part /6 , [<<>>, Sign , 0 , Nexts , Buf , Opt ]);
@@ -355,6 +375,7 @@ number_integer_part(<<>>, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
355
375
number_integer_part (Bin , Sign , Nexts , Buf , Opt ) ->
356
376
? ERROR (number_integer_part , [Bin , Sign , Nexts , Buf , Opt ]).
357
377
378
+
358
379
- spec number_integer_part_rest (binary (), non_neg_integer (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
359
380
number_integer_part_rest (<<C , Bin /binary >>, N , Sign , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
360
381
number_integer_part_rest (Bin , N * 10 + C - $0 , Sign , Nexts , Buf , Opt );
@@ -363,12 +384,14 @@ number_integer_part_rest(<<>>, N, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
363
384
number_integer_part_rest (<<Bin /binary >>, N , Sign , Nexts , Buf , Opt ) ->
364
385
number_fraction_part (Bin , Sign , N , Nexts , Buf , Opt ).
365
386
387
+
366
388
- spec number_fraction_part (binary (), 1 | - 1 , non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
367
389
number_fraction_part (<<$. , Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
368
390
number_fraction_part_rest (Bin , Sign , Int , 0 , Nexts , Buf , Opt );
369
391
number_fraction_part (<<Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
370
392
number_exponation_part (Bin , Sign * Int , 0 , Nexts , Buf , Opt ).
371
393
394
+
372
395
- spec number_fraction_part_rest (binary (), 1 | - 1 , non_neg_integer (), non_neg_integer (), [next ()], binary (), opt ()) ->
373
396
decode_result ().
374
397
number_fraction_part_rest (<<C , Bin /binary >>, Sign , N , DecimalOffset , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
@@ -380,6 +403,7 @@ number_fraction_part_rest(<<Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Op
380
403
number_fraction_part_rest (Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ) ->
381
404
? ERROR (number_fraction_part_rest , [Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ]).
382
405
406
+
383
407
- spec number_exponation_part (binary (), integer (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
384
408
number_exponation_part (<<$e , $+ , Bin /binary >>, N , DecimalOffset , Nexts , Buf , Opt ) ->
385
409
number_exponation_part (Bin , N , DecimalOffset , 1 , 0 , true , Nexts , Buf , Opt );
@@ -406,6 +430,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
406
430
next (Bin , N / math :pow (10 , DecimalOffset ), Nexts , Buf , Opt )
407
431
end .
408
432
433
+
409
434
- spec number_exponation_part (binary (),
410
435
integer (),
411
436
non_neg_integer (),
@@ -498,10 +523,12 @@ make_object([], _) ->
498
523
make_object (Members , _ ) ->
499
524
lists :reverse (Members ).
500
525
526
+
501
527
- spec parse_options ([jsone :decode_option ()]) -> opt ().
502
528
parse_options (Options ) ->
503
529
parse_option (Options , ? OPT {}).
504
530
531
+
505
532
- spec parse_option ([jsone :decode_option ()], opt ()) -> opt ().
506
533
parse_option ([], Opt ) ->
507
534
Opt ;
0 commit comments