|
23 | 23 | -include("msgpack.hrl"). |
24 | 24 | -include_lib("eunit/include/eunit.hrl"). |
25 | 25 |
|
26 | | --export([unpack_map_jiffy/4, unpack_map_jsx/4]). |
| 26 | +-export([unpack_map/3, unpack_map_jiffy/3, unpack_map_jsx/3]). |
27 | 27 |
|
28 | 28 | %% unpack them all |
29 | 29 | -spec unpack_stream(Bin::binary(), msgpack_option()) -> {msgpack:object(), binary()} | no_return(). |
@@ -94,14 +94,14 @@ unpack_stream(<<16#DD, L:32/big-unsigned-integer-unit:1, Rest/binary>>, Opt) -> |
94 | 94 | %% Maps |
95 | 95 | unpack_stream(<<2#1000:4, L:4, Rest/binary>>, Opt) -> |
96 | 96 | Unpacker = Opt?OPTION.map_unpack_fun, |
97 | | - Unpacker(Rest, L, [], Opt); |
| 97 | + Unpacker(Rest, L, Opt); |
98 | 98 | unpack_stream(<<16#DE, L:16/big-unsigned-integer-unit:1, Rest/binary>>, Opt) -> |
99 | 99 | Unpacker = Opt?OPTION.map_unpack_fun, |
100 | | - Unpacker(Rest, L, [], Opt); |
| 100 | + Unpacker(Rest, L, Opt); |
101 | 101 |
|
102 | 102 | unpack_stream(<<16#DF, L:32/big-unsigned-integer-unit:1, Rest/binary>>, Opt) -> |
103 | 103 | Unpacker = Opt?OPTION.map_unpack_fun, |
104 | | - Unpacker(Rest, L, [], Opt); |
| 104 | + Unpacker(Rest, L, Opt); |
105 | 105 |
|
106 | 106 | %% Tag-encoded lengths (kept last, for speed) |
107 | 107 | %% positive int |
@@ -166,34 +166,50 @@ unpack_array(Bin, Len, Acc, Opt) -> |
166 | 166 | {Term, Rest} = unpack_stream(Bin, Opt), |
167 | 167 | unpack_array(Rest, Len-1, [Term|Acc], Opt). |
168 | 168 |
|
| 169 | +map_unpacker(map) -> |
| 170 | + fun ?MODULE:unpack_map/3; |
169 | 171 | map_unpacker(jiffy) -> |
170 | | - fun ?MODULE:unpack_map_jiffy/4; |
| 172 | + fun ?MODULE:unpack_map_jiffy/3; |
171 | 173 | map_unpacker(jsx) -> |
172 | | - fun ?MODULE:unpack_map_jsx/4. |
| 174 | + fun ?MODULE:unpack_map_jsx/3. |
173 | 175 |
|
174 | 176 |
|
| 177 | +-spec unpack_map(binary(), non_neg_integer(), msgpack_option()) -> |
| 178 | + {map(), binary()} | no_return(). |
| 179 | +unpack_map(Bin, Len, Opt) -> |
| 180 | + {Map, Rest} = unpack_map_as_proplist(Bin, Len, [], Opt), |
| 181 | + {maps:from_list(Map), Rest}. |
| 182 | +%% unpack_map(Bin, Len, #{}, Opt). |
| 183 | + |
| 184 | +%% unpack_map(Bin, Len, Acc, _) -> {Acc, Bin}; |
| 185 | +%% unpack_map(Bin, Len, Acc, Opt) -> |
| 186 | +%% {Key, Rest} = unpack_stream(Bin, Opt), |
| 187 | +%% {Value, Rest2} = unpack_stream(Rest, Opt), |
| 188 | +%% unpack_map(Rest2, Len-1, maps:put(Key, Value, Acc), Opt). |
| 189 | + |
175 | 190 | %% Users SHOULD NOT send too long list: this uses lists:reverse/1 |
176 | | --spec unpack_map_jiffy(binary(), non_neg_integer(), |
177 | | - msgpack:msgpack_map(), msgpack_option()) -> |
178 | | - {msgpack:msgpack_map(), binary()} | no_return(). |
179 | | -unpack_map_jiffy(Bin, 0, Acc, _) -> |
180 | | - {{lists:reverse(Acc)}, Bin}; |
181 | | -unpack_map_jiffy(Bin, Len, Acc, Opt) -> |
182 | | - {Key, Rest} = unpack_stream(Bin, Opt), |
183 | | - {Value, Rest2} = unpack_stream(Rest, Opt), |
184 | | - unpack_map_jiffy(Rest2, Len-1, [{Key,Value}|Acc], Opt). |
185 | | - |
186 | | --spec unpack_map_jsx(binary(), non_neg_integer(), |
187 | | - msgpack:msgpack_map(), msgpack_option()) -> |
188 | | - {msgpack:msgpack_map(), binary()} | no_return(). |
189 | | -unpack_map_jsx(Bin, 0, [], _) -> |
190 | | - {[{}], Bin}; |
191 | | -unpack_map_jsx(Bin, 0, Acc, _) -> |
| 191 | +-spec unpack_map_jiffy(binary(), non_neg_integer(), msgpack_option()) -> |
| 192 | + {msgpack:msgpack_map_jiffy(), binary()} | no_return(). |
| 193 | +unpack_map_jiffy(Bin, Len, Opt) -> |
| 194 | + {Map, Rest} = unpack_map_as_proplist(Bin, Len, [], Opt), |
| 195 | + {{Map}, Rest}. |
| 196 | + |
| 197 | +-spec unpack_map_jsx(binary(), non_neg_integer(), msgpack_option()) -> |
| 198 | + {msgpack:msgpack_map_jsx(), binary()} | no_return(). |
| 199 | +unpack_map_jsx(Bin, Len, Opt) -> |
| 200 | + case unpack_map_as_proplist(Bin, Len, [], Opt) of |
| 201 | + {[], Rest} -> {[{}], Rest}; |
| 202 | + {Map, Rest} -> {Map, Rest} |
| 203 | + end. |
| 204 | + |
| 205 | +-spec unpack_map_as_proplist(binary(), non_neg_integer(), proplists:proplist(), msgpack_option()) -> |
| 206 | + {proplists:proplist(), binary()} | no_return(). |
| 207 | +unpack_map_as_proplist(Bin, 0, Acc, _) -> |
192 | 208 | {lists:reverse(Acc), Bin}; |
193 | | -unpack_map_jsx(Bin, Len, Acc, Opt) -> |
| 209 | +unpack_map_as_proplist(Bin, Len, Acc, Opt) -> |
194 | 210 | {Key, Rest} = unpack_stream(Bin, Opt), |
195 | 211 | {Value, Rest2} = unpack_stream(Rest, Opt), |
196 | | - unpack_map_jsx(Rest2, Len-1, [{Key,Value}|Acc], Opt). |
| 212 | + unpack_map_as_proplist(Rest2, Len-1, [{Key,Value}|Acc], Opt). |
197 | 213 |
|
198 | 214 | unpack_string_or_raw(V, ?OPTION{enable_str=true} = _Opt, Rest) -> |
199 | 215 | {unpack_string(V), Rest}; |
|
0 commit comments