Skip to content

Commit c73f469

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

File tree

9 files changed

+307
-233
lines changed

9 files changed

+307
-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: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,28 @@
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).
78+
7779
-type opt() :: #decode_opt_v3{}.
7880

81+
7982
%%--------------------------------------------------------------------------------
8083
%% Exported Functions
8184
%%--------------------------------------------------------------------------------
8285
-spec decode(binary()) -> decode_result().
8386
decode(Json) ->
8487
decode(Json, []).
8588

89+
8690
-spec decode(binary(), [jsone:decode_option()]) -> decode_result().
8791
decode(<<Json/binary>>, Options) ->
8892
Opt = parse_options(Options),
@@ -93,6 +97,7 @@ decode(<<Json/binary>>, Options) ->
9397
Result
9498
end.
9599

100+
96101
%%--------------------------------------------------------------------------------
97102
%% Internal Functions
98103
%%--------------------------------------------------------------------------------
@@ -110,6 +115,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
110115
whitespace(Bin, {object_next, [{Key, Value} | Members]}, Nexts, Buf, Opt)
111116
end.
112117

118+
113119
-spec whitespace(binary(), whitespace_next(), [next()], binary(), opt()) -> decode_result().
114120
whitespace(<<$ , Bin/binary>>, Next, Nexts, Buf, Opt) ->
115121
whitespace(Bin, Next, Nexts, Buf, Opt);
@@ -139,6 +145,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
139145
object_next(Bin, Members, Nexts, Buf, Opt)
140146
end.
141147

148+
142149
-spec value(binary(), [next()], binary(), opt()) -> decode_result().
143150
value(<<"false", Bin/binary>>, Nexts, Buf, Opt) ->
144151
next(Bin, false, Nexts, Buf, Opt);
@@ -165,6 +172,7 @@ value(<<C, _/binary>> = Bin, Nexts, Buf, Opt) when
165172
value(<<Bin/binary>>, Nexts, Buf, Opt) ->
166173
number(Bin, Nexts, Buf, Opt).
167174

175+
168176
-spec array(binary(), [next()], binary(), opt()) -> decode_result().
169177
array(<<$], Bin/binary>>, Nexts, Buf, Opt) ->
170178
next(Bin, [], Nexts, Buf, Opt);
@@ -173,6 +181,7 @@ array(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
173181
array(<<Bin/binary>>, Nexts, Buf, Opt) ->
174182
value(Bin, [{array_next, []} | Nexts], Buf, Opt).
175183

184+
176185
-spec array_next(binary(), [jsone:json_value()], [next()], binary(), opt()) -> decode_result().
177186
array_next(<<$], Bin/binary>>, Values, Nexts, Buf, Opt) ->
178187
next(Bin, lists:reverse(Values), Nexts, Buf, Opt);
@@ -183,6 +192,7 @@ array_next(<<>>, Values, Nexts, Buf, Opt) when Opt?OPT.stream ->
183192
array_next(Bin, Values, Nexts, Buf, Opt) ->
184193
?ERROR(array_next, [Bin, Values, Nexts, Buf, Opt]).
185194

195+
186196
-spec object(binary(), [next()], binary(), opt()) -> decode_result().
187197
object(<<$}, Bin/binary>>, Nexts, Buf, Opt) ->
188198
next(Bin, make_object([], Opt), Nexts, Buf, Opt);
@@ -191,6 +201,7 @@ object(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
191201
object(<<Bin/binary>>, Nexts, Buf, Opt) ->
192202
object_key(Bin, [], Nexts, Buf, Opt).
193203

204+
194205
-spec object_key(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
195206
object_key(<<$", Bin/binary>>, Members, Nexts, Buf, Opt) ->
196207
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 ->
199210
object_key(<<Bin/binary>>, Members, Nexts, Buf, Opt) ->
200211
?ERROR(object_key, [Bin, Members, Nexts, Buf, Opt]).
201212

213+
202214
-spec object_value(binary(), jsone:json_string(), jsone:json_object_members(), [next()], binary(), opt()) ->
203215
decode_result().
204216
object_value(<<$:, Bin/binary>>, Key, Members, Nexts, Buf, Opt) ->
@@ -209,6 +221,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
209221
?ERROR(object_value, [Bin, Key, Members, Nexts, Buf, Opt]).
210222

211223
-compile({inline, [object_key/2]}).
224+
225+
212226
object_key(Key, ?OPT{keys = binary}) ->
213227
Key;
214228
object_key(Key, ?OPT{keys = atom}) ->
@@ -223,6 +237,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
223237
Key
224238
end.
225239

240+
226241
-spec object_next(binary(), jsone:json_object_members(), [next()], binary(), opt()) -> decode_result().
227242
object_next(<<$}, Bin/binary>>, Members, Nexts, Buf, Opt) ->
228243
next(Bin, make_object(Members, Opt), Nexts, Buf, Opt);
@@ -233,10 +248,12 @@ object_next(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
233248
object_next(Bin, Members, Nexts, Buf, Opt) ->
234249
?ERROR(object_next, [Bin, Members, Nexts, Buf, Opt]).
235250

251+
236252
-spec string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
237253
string(<<Bin/binary>>, Start, Nexts, Buf, Opt) ->
238254
string(Bin, Bin, Start, Nexts, Buf, Opt).
239255

256+
240257
-spec string(binary(), binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
241258
string(<<$", Bin/binary>>, Base, Start, Nexts, Buf, Opt) ->
242259
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 ->
293310
string(Bin, Base, Start, Nexts, Buf, Opt) ->
294311
?ERROR(string, [Bin, Base, Start, Nexts, Buf, Opt]).
295312

313+
296314
-spec unicode_string(binary(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
297315
unicode_string(<<N:4/binary, Bin/binary>> = Bin0, Start, Nexts, Buf, Opt) ->
298316
try
@@ -337,12 +355,14 @@ unicode_string(Bin, Start, Nexts, Buf, Opt) when byte_size(Bin) < 4, Opt?OPT.str
337355
unicode_string(Bin, Start, Nexts, Buf, Opt) ->
338356
?ERROR(unicode_string, [Bin, Start, Nexts, Buf, Opt]).
339357

358+
340359
-spec number(binary(), [next()], binary(), opt()) -> decode_result().
341360
number(<<$-, Bin/binary>>, Nexts, Buf, Opt) ->
342361
number_integer_part(Bin, -1, Nexts, Buf, Opt);
343362
number(<<Bin/binary>>, Nexts, Buf, Opt) ->
344363
number_integer_part(Bin, 1, Nexts, Buf, Opt).
345364

365+
346366
-spec number_integer_part(binary(), 1 | -1, [next()], binary(), opt()) -> decode_result().
347367
number_integer_part(<<$0>>, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
348368
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 ->
355375
number_integer_part(Bin, Sign, Nexts, Buf, Opt) ->
356376
?ERROR(number_integer_part, [Bin, Sign, Nexts, Buf, Opt]).
357377

378+
358379
-spec number_integer_part_rest(binary(), non_neg_integer(), 1 | -1, [next()], binary(), opt()) -> decode_result().
359380
number_integer_part_rest(<<C, Bin/binary>>, N, Sign, Nexts, Buf, Opt) when $0 =< C, C =< $9 ->
360381
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 ->
363384
number_integer_part_rest(<<Bin/binary>>, N, Sign, Nexts, Buf, Opt) ->
364385
number_fraction_part(Bin, Sign, N, Nexts, Buf, Opt).
365386

387+
366388
-spec number_fraction_part(binary(), 1 | -1, non_neg_integer(), [next()], binary(), opt()) -> decode_result().
367389
number_fraction_part(<<$., Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
368390
number_fraction_part_rest(Bin, Sign, Int, 0, Nexts, Buf, Opt);
369391
number_fraction_part(<<Bin/binary>>, Sign, Int, Nexts, Buf, Opt) ->
370392
number_exponation_part(Bin, Sign * Int, 0, Nexts, Buf, Opt).
371393

394+
372395
-spec number_fraction_part_rest(binary(), 1 | -1, non_neg_integer(), non_neg_integer(), [next()], binary(), opt()) ->
373396
decode_result().
374397
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
380403
number_fraction_part_rest(Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt) ->
381404
?ERROR(number_fraction_part_rest, [Bin, Sign, N, DecimalOffset, Nexts, Buf, Opt]).
382405

406+
383407
-spec number_exponation_part(binary(), integer(), non_neg_integer(), [next()], binary(), opt()) -> decode_result().
384408
number_exponation_part(<<$e, $+, Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
385409
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) ->
406430
next(Bin, N / math:pow(10, DecimalOffset), Nexts, Buf, Opt)
407431
end.
408432

433+
409434
-spec number_exponation_part(binary(),
410435
integer(),
411436
non_neg_integer(),
@@ -498,10 +523,12 @@ make_object([], _) ->
498523
make_object(Members, _) ->
499524
lists:reverse(Members).
500525

526+
501527
-spec parse_options([jsone:decode_option()]) -> opt().
502528
parse_options(Options) ->
503529
parse_option(Options, ?OPT{}).
504530

531+
505532
-spec parse_option([jsone:decode_option()], opt()) -> opt().
506533
parse_option([], Opt) ->
507534
Opt;

0 commit comments

Comments
 (0)