浏览代码

Allow iodata() for object keys

46-string-keys
Paul J. Davis 11 年前
父节点
当前提交
71f6992db7
共有 3 个文件被更改,包括 22 次插入4 次删除
  1. +6
    -0
      README.md
  2. +1
    -4
      c_src/encoder.c
  3. +15
    -0
      test/006-maps.t

+ 6
- 0
README.md 查看文件

@ -46,8 +46,14 @@ Data Format
[true, 1.0] -> [true, 1.0] -> [true, 1.0]
{[]} -> {} -> {[]}
{[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
{[{"foo", bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
{[{"foo", "bar"}]} -> {"foo": [98,97,114]} -> {[{<<"foo">>, "bar"}]}
{[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
Its important to note that while keys in objects can be an iolist(),
values will always be treated as arrays of integeres regardless of
whether Erlang displays them as a string.
Improvements over EEP0018
-------------------------

+ 1
- 4
c_src/encoder.c 查看文件

@ -232,10 +232,7 @@ enc_string(Encoder* e, ERL_NIF_TERM val)
int uval;
int i;
if(enif_is_binary(e->env, val)) {
if(!enif_inspect_binary(e->env, val, &bin)) {
return 0;
}
if(enif_inspect_iolist_as_binary(e->env, val, &bin)) {
data = bin.data;
size = bin.size;
} else if(enif_is_atom(e->env, val)) {

+ 15
- 0
test/006-maps.t 查看文件

@ -8,6 +8,7 @@ main([]) ->
etap:plan(15),
util:test_good(good()),
test_encode(),
util:test_errors(errors()),
etap:end_tests().
@ -22,6 +23,20 @@ good() ->
<<"{\"foo\":\"bar\",\"baz\":123}">>}
].
test_encode() ->
% Its ok to use iolist() for keys
Cases = [
{<<"{\"foo\":true}">>, {[{"foo",true}]}},
{<<"{\"foo\":true}">>, {[{["f","o",<<"o">>],true}]}},
{<<"{\"foo\":[98,97,114]}">>, {[{"foo","bar"}]}}
],
lists:foreach(fun({J, E}) ->
Msg = lists:flatten(io_lib:format("Encoded ~p", [E])),
etap:is(jiffy:encode(E), J, Msg)
end, Cases).
errors() ->
[
<<"{">>,

正在加载...
取消
保存