diff --git a/include/jsx.hrl b/include/jsx.hrl index 918736b..b415be1 100644 --- a/include/jsx.hrl +++ b/include/jsx.hrl @@ -1,5 +1,6 @@ -record(opts, { comments = false, escaped_unicode = ascii, - naked_values = false + naked_values = false, + encoding = utf8 }). \ No newline at end of file diff --git a/src/jsx.erl b/src/jsx.erl new file mode 100644 index 0000000..490bd50 --- /dev/null +++ b/src/jsx.erl @@ -0,0 +1,34 @@ +-module(jsx). + +-export([decoder/0, decoder/1]). + +-include("../include/jsx.hrl"). + +decoder() -> + decoder([]). + +decoder(OptsList) -> + OptsRec = parse_opts(OptsList), + case OptsRec#opts.encoding of + utf8 -> + fun(Stream) -> jsx_utf8:start(Stream, [], [], OptsRec) end + end. + + +parse_opts(Opts) -> + parse_opts(Opts, #opts{}). + +parse_opts([], Opts) -> + Opts; +parse_opts([{comments, Value}|Rest], Opts) -> + true = lists:member(Value, [true, false]), + parse_opts(Rest, Opts#opts{comments = Value}); +parse_opts([{escaped_unicode, Value}|Rest], Opts) -> + true = lists:member(Value, [ascii, codepoint, none]), + parse_opts(Rest, Opts#opts{escaped_unicode = Value}); +parse_opts([{naked_values, Value}|Rest], Opts) -> + true = lists:member(Value, [true, false]), + parse_opts(Rest, Opts#opts{naked_values = Value}); +parse_opts([{encoding, Value}|Rest], Opts) -> + true = lists:member(Value, [utf8]), + parse_opts(Rest, Opts#opts{encoding = Value}). \ No newline at end of file diff --git a/src/jsx_utf8.erl b/src/jsx_utf8.erl index 58e73e3..b214ee5 100644 --- a/src/jsx_utf8.erl +++ b/src/jsx_utf8.erl @@ -204,7 +204,7 @@ escaped_unicode(<>, Stack, Callbacks, Opts, String, [C, B, string(Rest, Stack, Callbacks, Opts, [X] ++ String) ; codepoint -> string(Rest, Stack, Callbacks, Opts, [X] ++ String) - ; _ -> + ; none -> string(Rest, Stack, Callbacks, Opts, [?rsolidus, $u, A, B, C, D] ++ String) end; escaped_unicode(<>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) ->