jsx/src/jsx.erl

170 lines
4.9 KiB
Erlang
Raw Normal View History

2010-05-25 21:26:55 -07:00
%% The MIT License
2010-05-25 21:48:36 -07:00
%% Copyright (c) 2010 Alisdair Sullivan <alisdairsullivan@yahoo.ca>
2010-05-25 21:26:55 -07:00
%% Permission is hereby granted, free of charge, to any person obtaining a copy
%% of this software and associated documentation files (the "Software"), to deal
%% in the Software without restriction, including without limitation the rights
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
%% copies of the Software, and to permit persons to whom the Software is
%% furnished to do so, subject to the following conditions:
%% The above copyright notice and this permission notice shall be included in
%% all copies or substantial portions of the Software.
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
%% THE SOFTWARE.
2010-05-18 13:01:49 -07:00
-module(jsx).
-export([encode/1, encode/2, decode/1, decode/2]).
-export([is_json/1, is_json/2, is_term/1, is_term/2]).
2012-05-12 23:28:48 +00:00
-export([format/1, format/2, minify/1, prettify/1]).
2012-05-23 06:47:58 -07:00
-export([encoder/3, decoder/3, parser/3]).
2011-11-29 19:56:00 -08:00
%% old api
-export([term_to_json/1, term_to_json/2, json_to_term/1, json_to_term/2]).
-export([to_json/1, to_json/2]).
-export([to_term/1, to_term/2]).
-export_type([json_term/0, json_text/0]).
%% test handler
-ifdef(TEST).
-export([init/1, handle_event/2]).
-endif.
2012-05-23 06:47:58 -07:00
-type json_term() :: list({binary(), json_term()})
| list(json_term())
2012-05-22 21:51:23 -07:00
| true
| false
| null
| integer()
| float()
| binary().
2012-05-23 06:47:58 -07:00
-type json_text() :: binary().
2012-05-23 06:47:58 -07:00
-spec encode(Source::json_term()) -> json_text() | {incomplete, encoder()}.
-spec encode(Source::json_term(), Opts::jsx_to_json:opts()) -> json_text() | {incomplete, encoder()}.
encode(Source) -> encode(Source, []).
encode(Source, Opts) -> jsx_to_json:to_json(Source, Opts).
%% old api, alias for encode/x
2012-03-05 20:37:22 -08:00
to_json(Source) -> encode(Source, []).
to_json(Source, Opts) -> encode(Source, Opts).
term_to_json(Source) -> encode(Source, []).
term_to_json(Source, Opts) -> encode(Source, Opts).
-spec format(Source::json_text()) -> json_text() | {incomplete, decoder()}.
-spec format(Source::json_text(), Opts::jsx_to_json:opts()) -> json_text() | {incomplete, decoder()}.
2011-11-29 19:56:00 -08:00
format(Source) -> format(Source, []).
format(Source, Opts) -> jsx_to_json:format(Source, Opts).
2011-11-29 19:56:00 -08:00
-spec minify(Source::json_text()) -> json_text() | {incomplete, decoder()}.
2012-05-12 23:28:48 +00:00
minify(Source) -> format(Source, []).
-spec prettify(Source::json_text()) -> json_text() | {incomplete, decoder()}.
2012-05-12 23:28:48 +00:00
prettify(Source) -> format(Source, [space, {indent, 2}]).
-spec decode(Source::json_text()) -> json_term() | {incomplete, decoder()}.
-spec decode(Source::json_text(), Opts::jsx_to_term:opts()) -> json_term() | {incomplete, decoder()}.
decode(Source) -> decode(Source, []).
decode(Source, Opts) -> jsx_to_term:to_term(Source, Opts).
2011-11-29 19:56:00 -08:00
%% old api, alias for to_term/x
2011-11-29 19:56:00 -08:00
to_term(Source) -> decode(Source, []).
to_term(Source, Opts) -> decode(Source, Opts).
json_to_term(Source) -> decode(Source, []).
json_to_term(Source, Opts) -> decode(Source, Opts).
2011-11-29 19:56:00 -08:00
2012-05-22 21:51:23 -07:00
-spec is_json(Source::any()) -> true | false.
-spec is_json(Source::any(), Opts::jsx_verify:opts()) -> true | false.
is_json(Source) -> is_json(Source, []).
is_json(Source, Opts) -> jsx_verify:is_json(Source, Opts).
-spec is_term(Source::any()) -> true | false.
-spec is_term(Source::any(), Opts::jsx_verify:opts()) -> true | false.
is_term(Source) -> is_term(Source, []).
is_term(Source, Opts) -> jsx_verify:is_term(Source, Opts).
2012-05-23 06:47:58 -07:00
-type decoder() :: fun((json_text() | end_stream) -> any()).
-spec decoder(Handler::module(), State::any(), Opts::list()) -> decoder().
decoder(Handler, State, Opts) -> jsx_decoder:decoder(Handler, State, Opts).
2012-05-23 06:47:58 -07:00
-type encoder() :: fun((json_term() | end_stream) -> any()).
-spec encoder(Handler::module(), State::any(), Opts::list()) -> encoder().
encoder(Handler, State, Opts) -> jsx_encoder:encoder(Handler, State, Opts).
2012-05-23 06:47:58 -07:00
-type token() :: [token()]
| start_object
| end_object
| start_array
| end_array
| {key, binary()}
| {string, binary()}
| binary()
| {number, integer() | float()}
| {integer, integer()}
| {float, float()}
| integer()
| float()
| {literal, true}
| {literal, false}
| {literal, null}
| true
| false
| null
| end_json.
2012-05-23 06:47:58 -07:00
-type parser() :: fun((token() | end_stream) -> any()).
-spec parser(Handler::module(), State::any(), Opts::list()) -> parser().
parser(Handler, State, Opts) -> jsx_parser:parser(Handler, State, Opts).
-ifdef(TEST).
2011-08-09 21:02:20 -07:00
-include_lib("eunit/include/eunit.hrl").
%% stub test handler
init([]) -> [].
handle_event(end_json, State) -> lists:reverse([end_json] ++ State);
handle_event(Event, State) -> [Event] ++ State.
-endif.