summaryrefslogtreecommitdiff
path: root/erlang
diff options
context:
space:
mode:
authorUENISHI Kota <kuenishi+github@gmail.com>2010-06-29 00:21:47 +0900
committerUENISHI Kota <kuenishi+github@gmail.com>2010-06-29 00:23:49 +0900
commit90e305d789d231258e26a2dc546cfdb6f8c09ce8 (patch)
treef547b68495f1f389671869068fd1a6b227857b9c /erlang
parent9b5fc37399dbd8b213d69be7d7d2d8cacc83e670 (diff)
downloadmsgpack-python-90e305d789d231258e26a2dc546cfdb6f8c09ce8.tar.gz
erlang: explicit API for serializing proplists,
so as not to make wrong call of pack({proplists()}).
Diffstat (limited to 'erlang')
-rw-r--r--erlang/msgpack.erl25
1 files changed, 12 insertions, 13 deletions
diff --git a/erlang/msgpack.erl b/erlang/msgpack.erl
index c807065..a168b55 100644
--- a/erlang/msgpack.erl
+++ b/erlang/msgpack.erl
@@ -24,6 +24,7 @@
%% for C API (http://msgpack.sourceforge.jp/c:doc)
%% except buffering functions (both copying and zero-copying).
-export([pack/1, unpack/1, unpack_all/1]).
+-export([pack_map/1]).
% compile:
% erl> c(msgpack).
@@ -51,7 +52,7 @@ pack(List) when is_list(List) ->
pack({Map}) when is_list(Map) ->
pack_map(Map);
pack(Map) when is_tuple(Map), element(1,Map)=:=dict ->
- pack_map(dict:from_list(Map));
+ pack_map(dict:to_list(Map));
pack(_O) ->
{error, undefined}.
@@ -78,6 +79,15 @@ unpack_all(Data)->
[Term|unpack_all(Binary)]
end.
+pack_map(M)->
+ case length(M) of
+ Len when Len < 16 ->
+ << 2#1000:4, Len:4/integer-unit:1, (pack_map_(M, <<>>))/binary >>;
+ Len when Len < 16#10000 -> % 65536
+ << 16#DE:8, Len:16/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >>;
+ Len ->
+ << 16#DF:8, Len:32/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >>
+ end.
% ===== internal APIs ===== %
@@ -162,17 +172,6 @@ unpack_array_(Bin, RestLen, RetList) when is_binary(Bin)->
{Term, Rest}-> unpack_array_(Rest, RestLen-1, [Term|RetList])
end.
-% FIXME: write test for pack_map/1
-pack_map(M)->
- case length(M) of
- Len when Len < 16 ->
- << 2#1000:4, Len:4/integer-unit:1, (pack_map_(M, <<>>))/binary >>;
- Len when Len < 16#10000 -> % 65536
- << 16#DE:8, Len:16/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >>;
- Len ->
- << 16#DF:8, Len:32/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >>
- end.
-
pack_map_([], Acc) -> Acc;
pack_map_([{Key,Value}|Tail], Acc) ->
pack_map_(Tail, << Acc/binary, (pack(Key))/binary, (pack(Value))/binary>>).
@@ -404,7 +403,7 @@ unknown_test()->
-234.4355, 1.0e-34, 1.0e64,
[23, 234, 0.23],
[0,42,<<"sum">>, [1,2]], [1,42, nil, [3]],
- dict:from_list([{1,2},{<<"hoge">>,nil}]),
+ {[{1,2},{<<"hoge">>,nil}]},
-234, -50000,
42
],