From 3bf5506292ece95d7954e61d6d036b684f3af695 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Thu, 21 Jul 2011 06:14:48 -0700 Subject: [PATCH] unifies options to encoder/decoder to allow abstraction over various different built in iterators --- src/jsx.erl | 11 ++++++++--- src/jsx_common.hrl | 4 ++-- src/jsx_decoder.hrl | 2 +- src/jsx_encoder.erl | 10 +++++----- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/jsx.erl b/src/jsx.erl index 33e09d1..0af0af1 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -47,7 +47,7 @@ parser() -> decoder([]). --spec parser(OptsList::jsx_decoder_opts()) -> jsx_decoder(). +-spec parser(OptsList::jsx_opts()) -> jsx_decoder(). parser(OptsList) -> decoder(OptsList). @@ -58,7 +58,7 @@ parser(OptsList) -> decoder(OptsList). decoder() -> decoder([]). --spec decoder(OptsList::jsx_decoder_opts()) -> jsx_decoder(). +-spec decoder(OptsList::jsx_opts()) -> jsx_decoder(). decoder(OptsList) -> @@ -74,7 +74,12 @@ decoder(OptsList) -> -spec encoder() -> jsx_encoder(). -encoder() -> jsx_encoder:encoder(). +encoder() -> encoder([]). + + +-spec encoder(OptsList::jsx_opts()) -> jsx_encoder(). + +encoder(Opts) -> jsx_encoder:encoder(Opts). -spec json_to_term(JSON::binary()) -> eep0018(). diff --git a/src/jsx_common.hrl b/src/jsx_common.hrl index d77f2b5..bbcec79 100644 --- a/src/jsx_common.hrl +++ b/src/jsx_common.hrl @@ -32,8 +32,8 @@ --type jsx_decoder_opts() :: [jsx_decoder_opt()]. --type jsx_decoder_opt() :: {escaped_unicode, ascii | codepoint | none} +-type jsx_opts() :: [jsx_opt()]. +-type jsx_opt() :: {escaped_unicode, ascii | codepoint | none} | {multi_term, true | false} | {encoding, auto | utf8 diff --git a/src/jsx_decoder.hrl b/src/jsx_decoder.hrl index c0c0416..a1349d7 100644 --- a/src/jsx_decoder.hrl +++ b/src/jsx_decoder.hrl @@ -26,7 +26,7 @@ %% this file should take that into account --spec decoder(OptsList::jsx_decoder_opts()) -> jsx_decoder(). +-spec decoder(OptsList::jsx_opts()) -> jsx_decoder(). %% opts record for decoder -record(opts, { diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index 53ca699..fc6eab2 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -24,16 +24,16 @@ -module(jsx_encoder). --export([encoder/0]). +-export([encoder/1]). -include("jsx_common.hrl"). --spec encoder() -> jsx_encoder(). +-spec encoder(Opts::jsx_opts()) -> jsx_encoder(). -encoder() -> fun(Forms) -> start(Forms) end. +encoder(_) -> fun(Forms) -> start(Forms) end. -define(ENDJSON, @@ -130,7 +130,7 @@ encode(Terms) -> encode_whole(Terms) andalso encode_incremental(Terms). encode_whole(Terms) -> - case loop((encoder())(Terms), []) of + case loop((encoder([]))(Terms), []) of %% unwrap naked values {ok, [Terms]} -> true ; {ok, Terms} -> true @@ -139,7 +139,7 @@ encode_whole(Terms) -> encode_incremental(Terms) when is_list(Terms) -> - encode_incremental(Terms, encoder(), Terms, []); + encode_incremental(Terms, encoder([]), Terms, []); %% we could feed naked terms to the regular encoder, but we already do that, so %% cheat instead encode_incremental(_) -> true.