Skip to content

Commit e47ee71

Browse files
committed
Merge remote-tracking branch 'origin/master' into stream
2 parents f453854 + 042ad00 commit e47ee71

File tree

9 files changed

+309
-233
lines changed

9 files changed

+309
-233
lines changed

rebar.config

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,31 @@
11
%% -*- erlang -*-
2-
{erl_opts,
3-
[warnings_as_errors,
4-
warn_export_all,
5-
warn_untyped_record,
6-
inline,
7-
{platform_define, "^R[01][0-9]", 'NO_MAP_TYPE'},
8-
{platform_define, "^(R|17)", 'NO_DIALYZER_SPEC'}]}.
2+
{erl_opts, [warnings_as_errors,
3+
warn_export_all,
4+
warn_untyped_record,
5+
inline,
6+
{platform_define, "^R[01][0-9]", 'NO_MAP_TYPE'},
7+
{platform_define, "^(R|17)", 'NO_DIALYZER_SPEC'}]}.
98

109
{xref_checks, [fail_on_warning, undefined_function_calls]}.
1110

1211
{clean_files, [".eunit/*", "ebin/*.beam"]}.
1312

1413
{cover_enabled, true}.
1514

16-
{edoc_opts,
17-
[{dialyzer_specs, all},
18-
{report_missing_type, true},
19-
{report_type_mismatch, true},
20-
{pretty_print, erl_pp},
21-
{preprocess, true}]}.
15+
{edoc_opts, [{dialyzer_specs, all},
16+
{report_missing_type, true},
17+
{report_type_mismatch, true},
18+
{pretty_print, erl_pp},
19+
{preprocess, true}]}.
2220
{validate_app_modules, true}.
2321

2422
{shell, [{apps, [jsone]}]}.
2523

2624
{dialyzer, [{warnings, [error_handling, race_conditions, unmatched_returns, unknown, no_improper_lists]}]}.
2725

28-
{profiles,
29-
[{native, [{erl_opts, [{d, 'ENABLE_HIPE'}]}]}, {edown, [{edoc_opts, [{doclet, edown_doclet}]}, {deps, [edown]}]}]}.
26+
{profiles, [{native, [{erl_opts, [{d, 'ENABLE_HIPE'}]}]},
27+
{edown, [{edoc_opts, [{doclet, edown_doclet}]}, {deps, [edown]}]}]}.
3028

31-
{project_plugins, [covertool]}.
29+
{project_plugins, [covertool, rebar3_efmt]}.
3230
{cover_export_enabled, true}.
3331
{covertool, [{coverdata_files, ["ct.coverdata", "eunit.coverdata"]}]}.
34-
35-
{plugins, [rebar3_efmt]}.

src/jsone.app.src

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
{application,
2-
jsone,
3-
[{description, "Erlang JSON Library"},
4-
{vsn, "1.7.0"},
5-
{registered, []},
6-
{applications, [kernel, stdlib]},
7-
{licenses, ["MIT"]},
8-
{links, [{"GitHub", "https://github.com/sile/jsone"}]},
9-
{env, []}]}.
1+
{application, jsone,
2+
[{description, "Erlang JSON Library"},
3+
{vsn, "1.7.0"},
4+
{registered, []},
5+
{applications, [kernel, stdlib]},
6+
{licenses, ["MIT"]},
7+
{links, [{"GitHub", "https://github.com/sile/jsone"}]},
8+
{env, []}]}.

src/jsone.erl

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,10 @@
2929
%%--------------------------------------------------------------------------------
3030
%% Exported API
3131
%%--------------------------------------------------------------------------------
32-
-export([decode/1,
33-
decode/2,
34-
try_decode/1,
35-
try_decode/2,
36-
encode/1,
37-
encode/2,
38-
try_encode/1,
39-
try_encode/2,
32+
-export([decode/1, decode/2,
33+
try_decode/1, try_decode/2,
34+
encode/1, encode/2,
35+
try_encode/1, try_encode/2,
4036
term_to_json_string/1,
4137
ip_address_to_json_string/1]).
4238

@@ -206,7 +202,7 @@
206202
{object_key_type, string | scalar | value} |
207203
{space, non_neg_integer()} |
208204
{indent, non_neg_integer()} |
209-
{map_unknown_value, undefined | fun ((term()) -> {ok, json_value()} | error)} |
205+
{map_unknown_value, undefined | fun((term()) -> {ok, json_value()} | error)} |
210206
skip_undefined |
211207
common_option().
212208
%% `native_utf8': <br />
@@ -318,12 +314,13 @@
318314
%% The 'OTP_RELEASE' macro introduced at OTP-21,
319315
%% so we can use it for detecting whether the Erlang compiler supports new try/catch syntax or not.
320316
-define(CAPTURE_STACKTRACE, :__StackTrace).
321-
-define(GET_STACKTRACE, __StackTrace).
317+
-define(GET_STACKTRACE, __StackTrace).
322318
-else.
323319
-define(CAPTURE_STACKTRACE, ).
324-
-define(GET_STACKTRACE, erlang:get_stacktrace()).
320+
-define(GET_STACKTRACE, erlang:get_stacktrace()).
325321
-endif.
326322

323+
327324
%%--------------------------------------------------------------------------------
328325
%% Exported Functions
329326
%%--------------------------------------------------------------------------------
@@ -332,6 +329,7 @@
332329
decode(Json) ->
333330
decode(Json, []).
334331

332+
335333
%% @doc Decodes an erlang term from json text (a utf8 encoded binary)
336334
%%
337335
%% Raises an error exception if input is not valid json
@@ -387,6 +385,7 @@ replace_incomplete_fun(Fun) ->
387385
try_decode(Json) ->
388386
try_decode(Json, []).
389387

388+
390389
%% @doc Decodes an erlang term from json text (a utf8 encoded binary)
391390
%%
392391
%% ```
@@ -405,11 +404,13 @@ try_decode(Json) ->
405404
try_decode(Json, Options) ->
406405
jsone_decode:decode(Json, Options).
407406

407+
408408
%% @equiv encode(JsonValue, [])
409409
-spec encode(json_value()) -> binary().
410410
encode(JsonValue) ->
411411
encode(JsonValue, []).
412412

413+
413414
%% @doc Encodes an erlang term into json text (a utf8 encoded binary)
414415
%%
415416
%% Raises an error exception if input is not an instance of type `json_value()'
@@ -434,11 +435,13 @@ encode(JsonValue, Options) ->
434435
erlang:raise(error, Reason, [StackItem | ?GET_STACKTRACE])
435436
end.
436437

438+
437439
%% @equiv try_encode(JsonValue, [])
438440
-spec try_encode(json_value()) -> {ok, binary()} | {error, {Reason :: term(), [stack_item()]}}.
439441
try_encode(JsonValue) ->
440442
try_encode(JsonValue, []).
441443

444+
442445
%% @doc Encodes an erlang term into json text (a utf8 encoded binary)
443446
%%
444447
%% ```
@@ -454,11 +457,13 @@ try_encode(JsonValue) ->
454457
try_encode(JsonValue, Options) ->
455458
jsone_encode:encode(JsonValue, Options).
456459

460+
457461
%% @doc Converts the given term `X' to its string representation (i.e., the result of `io_lib:format("~p", [X])').
458462
-spec term_to_json_string(term()) -> {ok, json_string()} | error.
459463
term_to_json_string(X) ->
460464
{ok, list_to_binary(io_lib:format("~p", [X]))}.
461465

466+
462467
%% @doc Convert an IP address into a text representation.
463468
%%
464469
%% This function can be specified as the value of the `map_unknown_value' encoding option.
@@ -486,6 +491,7 @@ term_to_json_string(X) ->
486491
ip_address_to_json_string(X) ->
487492
jsone_inet:ip_address_to_json_string(X).
488493

494+
489495
%%--------------------------------------------------------------------------------
490496
%% Internal Functions
491497
%%--------------------------------------------------------------------------------

src/jsone_decode.erl

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,27 @@
6565
jsone:incomplete() |
6666
{error, {Reason :: term(), [jsone:stack_item()]}}.
6767

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+
}).
7677
-define(OPT, #decode_opt_v3).
7778
-type opt() :: #decode_opt_v3{}.
7879

80+
7981
%%--------------------------------------------------------------------------------
8082
%% Exported Functions
8183
%%--------------------------------------------------------------------------------
8284
-spec decode(binary()) -> decode_result().
8385
decode(Json) ->
8486
decode(Json, []).
8587

88+
8689
-spec decode(binary(), [jsone:decode_option()]) -> decode_result().
8790
decode(<<Json/binary>>, Options) ->
8891
Opt = parse_options(Options),
@@ -93,6 +96,7 @@ decode(<<Json/binary>>, Options) ->
9396
Result
9497
end.
9598

99+
96100
%%--------------------------------------------------------------------------------
97101
%% Internal Functions
98102
%%--------------------------------------------------------------------------------
@@ -110,6 +114,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
110114
whitespace(Bin, {object_next, [{Key, Value} | Members]}, Nexts, Buf, Opt)
111115
end.
112116

117+
113118
-spec whitespace(binary(), whitespace_next(), [next()], binary(), opt()) -> decode_result().
114119
whitespace(<<$ , Bin/binary>>, Next, Nexts, Buf, Opt) ->
115120
whitespace(Bin, Next, Nexts, Buf, Opt);
@@ -139,6 +144,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
139144
object_next(Bin, Members, Nexts, Buf, Opt)
140145
end.
141146

147+
142148
-spec value(binary(), [next()], binary(), opt()) -> decode_result().
143149
value(<<"false", Bin/binary>>, Nexts, Buf, Opt) ->
144150
next(Bin, false, Nexts, Buf, Opt);
@@ -165,6 +171,7 @@ value(<<C, _/binary>> = Bin, Nexts, Buf, Opt) when
165171
value(<<Bin/binary>>, Nexts, Buf, Opt) ->
166172
number(Bin, Nexts, Buf, Opt).
167173

174+
168175
-spec array(binary(), [next()], binary(), opt()) -> decode_result().
169176
array(<<$], Bin/binary>>, Nexts, Buf, Opt) ->
170177
next(Bin, [], Nexts, Buf, Opt);
@@ -173,6 +180,7 @@ array(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
173180
array(<<Bin/binary>>, Nexts, Buf, Opt) ->
174181
value(Bin, [{array_next, []} | Nexts], Buf, Opt).
175182

183+
176184
-spec array_next(binary(), [jsone:json_value()], [next()], binary(), opt()) -> decode_result().
177185
array_next(<<$], Bin/binary>>, Values, Nexts, Buf, Opt) ->
178186
next(Bin, lists:reverse(Values), Nexts, Buf, Opt);
@@ -183,6 +191,7 @@ array_next(<<>>, Values, Nexts, Buf, Opt) when Opt?OPT.stream ->
183191
array_next(Bin, Values, Nexts, Buf, Opt) ->
184192
?ERROR(array_next, [Bin, Values, Nexts, Buf, Opt]).
185193

194+
186195
-spec object(binary(), [next()], binary(), opt()) -> decode_result().
187196
object(<<$}, Bin/binary>>, Nexts, Buf, Opt) ->
188197
next(Bin, make_object([], Opt), Nexts, Buf, Opt);
@@ -191,6 +200,7 @@ object(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
191200
object(<<Bin/binary>>, Nexts, Buf, Opt) ->
192201
object_key(Bin, [], Nexts, Buf, Opt).
193202

203+
194204
-spec object_key(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
195205
object_key(<<$", Bin/binary>>, Members, Nexts, Buf, Opt) ->
196206
string(Bin, byte_size(Buf), [{object_value, Members} | Nexts], Buf, Opt);
@@ -199,6 +209,7 @@ object_key(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
199209
object_key(<<Bin/binary>>, Members, Nexts, Buf, Opt) ->
200210
?ERROR(object_key, [Bin, Members, Nexts, Buf, Opt]).
201211

212+
202213
-spec object_value(binary(), jsone:json_string(), jsone:json_object_members(), [next()], binary(), opt()) ->
203214
decode_result().
204215
object_value(<<$:, Bin/binary>>, Key, Members, Nexts, Buf, Opt) ->
@@ -209,6 +220,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
209220
?ERROR(object_value, [Bin, Key, Members, Nexts, Buf, Opt]).
210221

211222
-compile({inline, [object_key/2]}).
223+
224+
212225
object_key(Key, ?OPT{keys = binary}) ->
213226
Key;
214227
object_key(Key, ?OPT{keys = atom}) ->
@@ -223,6 +236,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
223236
Key
224237
end.
225238

239+
226240
-spec object_next(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
227241
object_next(<<$}, Bin/binary>>, Members, Nexts, Buf, Opt) ->
228242
next(Bin, make_object(Members, Opt), Nexts, Buf, Opt);
@@ -233,10 +247,12 @@ object_next(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
233247
object_next(Bin, Members, Nexts, Buf, Opt) ->
234248
?ERROR(object_next, [Bin, Members, Nexts, Buf, Opt]).
235249

250+
236251
-spec string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
237252
string(<<Bin/binary>>, Start, Nexts, Buf, Opt) ->
238253
string(Bin, Bin, Start, Nexts, Buf, Opt).
239254

255+
240256
-spec string(binary(), binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
241257
string(<<$", Bin/binary>>, Base, Start, Nexts, Buf, Opt) ->
242258
Prefix = binary:part(Base, 0, byte_size(Base) - byte_size(Bin) - 1),
@@ -293,6 +309,7 @@ string(<<>>, Base, Start, Nexts, Buf, Opt) when Opt?OPT.stream ->
293309
string(Bin, Base, Start, Nexts, Buf, Opt) ->
294310
?ERROR(string, [Bin, Base, Start, Nexts, Buf, Opt]).
295311

312+
296313
-spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
297314
unicode_string(<<N:4/binary, Bin/binary>> = Bin0, Start, Nexts, Buf, Opt) ->
298315
try
@@ -337,12 +354,14 @@ unicode_string(Bin, Start, Nexts, Buf, Opt) when byte_size(Bin) < 4, Opt?OPT.str
337354
unicode_string(Bin, Start, Nexts, Buf, Opt) ->
338355
?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
339356

357+
340358
-spec number(binary(), [next()], binary(), opt()) -> decode_result().
341359
number(<<$-, Bin/binary>>, Nexts, Buf, Opt) ->
342360
number_integer_part(Bin, -1, Nexts, Buf, Opt);
343361
number(<<Bin/binary>>, Nexts, Buf, Opt) ->
344362
number_integer_part(Bin, 1, Nexts, Buf, Opt).
345363

364+
346365
-spec number_integer_part(binary(), 1 | -1, [next()], binary(), opt()) -> decode_result().
347366
number_integer_part(<<$0>>, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
348367
incomplete(fun number_fraction_part/6, [<<>>, Sign, 0, Nexts, Buf, Opt]);
@@ -355,6 +374,7 @@ number_integer_part(<<>>, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
355374
number_integer_part(Bin, Sign, Nexts, Buf, Opt) ->
356375
?ERROR(number_integer_part, [Bin, Sign, Nexts, Buf, Opt]).
357376

377+
358378
-spec number_integer_part_rest(binary(), non_neg_integer(), 1 | -1, [next()], binary(), opt()) -> decode_result().
359379
number_integer_part_rest(<<C, Bin/binary>>, N, Sign, Nexts, Buf, Opt) when $0 =< C, C =< $9 ->
360380
number_integer_part_rest(Bin, N * 10 + C - $0, Sign, Nexts, Buf, Opt);
@@ -363,12 +383,14 @@ number_integer_part_rest(<<>>, N, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
363383
number_integer_part_rest(<<Bin/binary>>, N, Sign, Nexts, Buf, Opt) ->
364384
number_fraction_part(Bin, Sign, N, Nexts, Buf, Opt).
365385

386+
366387
-spec number_fraction_part(binary(), 1 | -1, non_neg_integer(), [next()], binary(), opt()) -> decode_result().
367388
number_fraction_part(<<$., Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
368389
number_fraction_part_rest(Bin, Sign, Int, 0, Nexts, Buf, Opt);
369390
number_fraction_part(<<Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
370391
number_exponation_part(Bin, Sign * Int, 0, Nexts, Buf, Opt).
371392

393+
372394
-spec number_fraction_part_rest(binary(), 1 | -1, non_neg_integer(), non_neg_integer(), [next()], binary(), opt()) ->
373395
decode_result().
374396
number_fraction_part_rest(<<C, Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Opt) when $0 =< C, C =< $9 ->
@@ -380,6 +402,7 @@ number_fraction_part_rest(<<Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Op
380402
number_fraction_part_rest(Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt) ->
381403
?ERROR(number_fraction_part_rest, [Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt]).
382404

405+
383406
-spec number_exponation_part(binary(), integer(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
384407
number_exponation_part(<<$e, $+, Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
385408
number_exponation_part(Bin, N, DecimalOffset, 1, 0, true, Nexts, Buf, Opt);
@@ -406,6 +429,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
406429
next(Bin, N / math:pow(10, DecimalOffset), Nexts, Buf, Opt)
407430
end.
408431

432+
409433
-spec number_exponation_part(binary(),
410434
integer(),
411435
non_neg_integer(),
@@ -438,6 +462,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Ne
438462
number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt) ->
439463
?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, IsFirst, Nexts, Buf, Opt]).
440464

465+
<<<<<<< HEAD
441466
incomplete_result({ok, Value, Rest} = Result) ->
442467
%% The user needs to call Fun(end_stream) to get the ok tuple.
443468
{incomplete,
@@ -485,6 +510,8 @@ incomplete_string(Remains, Base, Start, Nexts, Buf, Opt) ->
485510
<<Base/binary, More/binary>>,
486511
Start, Nexts, Buf, Opt))
487512
end}.
513+
=======
514+
>>>>>>> origin/master
488515

489516
-spec make_object(jsone:json_object_members(), opt()) -> jsone:json_object().
490517
make_object(Members, ?OPT{object_format = tuple}) ->
@@ -498,10 +525,12 @@ make_object([], _) ->
498525
make_object(Members, _) ->
499526
lists:reverse(Members).
500527

528+
501529
-spec parse_options([jsone:decode_option()]) -> opt().
502530
parse_options(Options) ->
503531
parse_option(Options, ?OPT{}).
504532

533+
505534
-spec parse_option([jsone:decode_option()], opt()) -> opt().
506535
parse_option([], Opt) ->
507536
Opt;

0 commit comments

Comments
 (0)