From 07903ff9d4e97bd70d0064c1aabc191edb00bf8a Mon Sep 17 00:00:00 2001 From: Gaspar Chilingarov Date: Thu, 29 Jun 2017 15:12:38 +0300 Subject: [PATCH 1/3] Allow encoding of int as map key to avoid forcing convertion to binary in Erlang --- c_src/encoder.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/c_src/encoder.c b/c_src/encoder.c index e864777..3ee1f59 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -814,9 +814,25 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ret = enc_obj_error(e, "invalid_object_member_arity", item); goto done; } - if(!enc_string(e, tuple[0])) { - ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]); - goto done; + if(enif_get_int64(env, tuple[0], &lval)) { + if (!enc_char(e, '"')) { + ret = enc_error(e, "internal_error"); + goto done; + } + if(!enc_long(e, lval)) { + ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]); + goto done; + } + if (!enc_char(e, '"')) { + ret = enc_error(e, "internal_error"); + goto done; + } + } + else { + if(!enc_string(e, tuple[0])) { + ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]); + goto done; + } } if(!enc_colon(e)) { ret = enc_error(e, "internal_error"); From 72bb9b77042f108d05480ca202ee6df93b440d7d Mon Sep 17 00:00:00 2001 From: Gaspar Chilingarov Date: Thu, 29 Jun 2017 15:36:10 +0300 Subject: [PATCH 2/3] fix tests --- test/jiffy_07_compound_tests.erl | 13 ++++++++++++- test/jiffy_12_error_tests.erl | 3 --- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/test/jiffy_07_compound_tests.erl b/test/jiffy_07_compound_tests.erl index 7a811db..3eadf19 100644 --- a/test/jiffy_07_compound_tests.erl +++ b/test/jiffy_07_compound_tests.erl @@ -9,7 +9,8 @@ compound_success_test_() -> - [gen(ok, Case) || Case <- cases(ok)]. + [gen(ok, Case) || Case <- cases(ok)] ++ + [gen(special_encoding, Case) || Case <- cases(special_encoding)]. compound_failure_test_() -> @@ -24,6 +25,11 @@ gen(ok, {J1, E, J2}) -> {"Encode", ?_assertEqual(J2, enc(E))} ]}; +gen(special_encoding, {J, E}) -> + {msg("~s", [J]), [ + {"Encode", ?_assertEqual(J, enc(E))} + ]}; + gen(error, J) -> {msg("Error: ~s", [J]), [ ?_assertThrow({error, _}, dec(J)) @@ -53,6 +59,11 @@ cases(ok) -> } ]; +cases(special_encoding) -> + [ + {<<"{\"123\":\"foo\"}">>, {[{123, <<"foo">>}]}} + ]; + cases(error) -> [ <<"[{}">>, diff --git a/test/jiffy_12_error_tests.erl b/test/jiffy_12_error_tests.erl index a7d4ed6..93471d7 100644 --- a/test/jiffy_12_error_tests.erl +++ b/test/jiffy_12_error_tests.erl @@ -71,13 +71,10 @@ enc_invalid_object_member_key_test_() -> E1 = {1, true}, {"invalid_object_member_key", [ {"Bad string", enc_error(Type, <<143>>, {[{<<143>>, true}]})}, - {"Basic", enc_error(Type, 1, {[{1, true}]})}, {"Basic", enc_error(Type, [1], {[{[1], true}]})}, {"Basic", enc_error(Type, {[{foo,bar}]}, {[{{[{foo,bar}]}, true}]})}, {"Second", enc_error(Type, 1, {[{bar, baz}, E1]})}, - {"Nested", enc_error(Type, 1, {[{bar,{[E1]}}]})}, {"Nested", enc_error(Type, 1, {[{bar,{[{baz, 1}, E1]}}]})}, - {"In List", enc_error(Type, 1, [{[E1]}])}, {"In List", enc_error(Type, 1, [{[{bang, true}, E1]}])} ]}. From ecc54c3b9f16b615e47d95b4f0a5ec6a1afe0ccc Mon Sep 17 00:00:00 2001 From: Gaspar Chilingarov Date: Sun, 12 Nov 2017 00:13:50 +0400 Subject: [PATCH 3/3] Fix code style and documentation. --- README.md | 4 +++- c_src/encoder.c | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e291de4..3ff36e8 100644 --- a/README.md +++ b/README.md @@ -95,10 +95,12 @@ Data Format [true, 1.0] -> [true, 1.0] -> [true, 1.0] {[]} -> {} -> {[]} {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} + {[{123, bar}]} -> {"123": "bar"} -> {[{<<"123">>, <<"bar">>}]} {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]} #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>} + #{123 => <<"bar">>} -> {"123": "bar"} -> #{<<"123">> => <<"bar">>} -N.B. The last entry in this table is only valid for VM's that support +N.B. The last two entries in this table are only valid for VM's that support the `maps` data type (i.e., 17.0 and newer) and client code must pass the `return_maps` option to `jiffy:decode/2`. diff --git a/c_src/encoder.c b/c_src/encoder.c index 3ee1f59..0a9ad48 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -827,8 +827,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ret = enc_error(e, "internal_error"); goto done; } - } - else { + } else { if(!enc_string(e, tuple[0])) { ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]); goto done;