summaryrefslogtreecommitdiff
path: root/lib/asn1/src/asn1rtt_jer.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/asn1/src/asn1rtt_jer.erl')
-rw-r--r--lib/asn1/src/asn1rtt_jer.erl36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/asn1/src/asn1rtt_jer.erl b/lib/asn1/src/asn1rtt_jer.erl
index 3fbab565fe..52a0f2f651 100644
--- a/lib/asn1/src/asn1rtt_jer.erl
+++ b/lib/asn1/src/asn1rtt_jer.erl
@@ -50,6 +50,8 @@ encode_jer({sequence_tab,Simple,Sname,Arity,CompInfos},Value)
%% Arity::integer() % number of components
%% CompInfos::[CompInfo()] % list of components with name, type etc
%% Value::record matching name and arity
+encode_jer({sequence_map,_Sname,_Arity,CompInfos},Value) when is_map(Value) ->
+ encode_jer_component_map(CompInfos,Value,[]);
encode_jer({sequence,Sname,Arity,CompInfos},Value)
when tuple_size(Value) == Arity+1 ->
[Sname|Clist] = tuple_to_list(Value),
@@ -167,6 +169,22 @@ encode_jer_component_tab([{Name, Type, _OptOrDefault} | CompInfos], [Value | Res
encode_jer_component_tab(CompInfos, Rest, Simple, MapAcc#{Name => Enc});
encode_jer_component_tab([], _, _Simple, MapAcc) ->
MapAcc.
+encode_jer_component_map([{Name, AName, Type, _OptOrDefault} | CompInfos], MapVal, Acc) when is_map_key(AName,MapVal)->
+ Value = maps:get(AName, MapVal),
+ Enc = encode_jer(Type, Value),
+ encode_jer_component_map(CompInfos, MapVal, [{Name,Enc}|Acc]);
+encode_jer_component_map([{_Name, _AName, _Type, 'OPTIONAL'} | CompInfos], MapVal, Acc) ->
+ encode_jer_component_map(CompInfos, MapVal, Acc);
+encode_jer_component_map([{_Name, _AName, _Type, {'DEFAULT',_}} | CompInfos], MapVal, Acc) ->
+ encode_jer_component_map(CompInfos, MapVal, Acc);
+encode_jer_component_map([], MapVal, []) when map_size(MapVal) == 0->
+ #{}; % ensure that it is encoded as an empty object in JSON
+encode_jer_component_map([], MapVal, Acc) when map_size(MapVal) == length(Acc) ->
+ lists:reverse(Acc);
+encode_jer_component_map(_, MapVal, Acc) ->
+ ErroneousKeys = maps:keys(MapVal) -- [K || {K,_V} <- Acc],
+ exit({error,{asn1,{{encode,'SEQUENCE'},{erroneous_keys,ErroneousKeys}}}}).
+
encode_jer_component([{_Name, _Type, 'OPTIONAL'} | CompInfos], [asn1_NOVALUE | Rest], Acc) ->
encode_jer_component(CompInfos, Rest, Acc);
@@ -210,6 +228,9 @@ decode_jer({sequence,Sname,_Arity,CompInfos},Value)
when is_map(Value) ->
DecodedComps = decode_jer_component(CompInfos,Value,[]),
list_to_tuple([Sname|DecodedComps]);
+decode_jer({sequence_map,_Sname,_Arity,CompInfos},Value)
+ when is_map(Value) ->
+ decode_jer_component_map(CompInfos,Value,[]);
%% Unfortunately we have to represent strings as lists to be compatible
%% with the other backends. Should add an option to the compiler in the future
@@ -298,6 +319,21 @@ decode_jer_component([{Name, _Type, _OptOrDefault} | _CompInfos], VMap, _Acc) ->
decode_jer_component([], _, Acc) ->
lists:reverse(Acc).
+decode_jer_component_map([{Name, AtomName, Type, _OptOrDefault} | CompInfos], VMap, Acc)
+ when is_map_key(Name, VMap) ->
+ Value = maps:get(Name, VMap),
+ Dec = decode_jer(Type, Value),
+ decode_jer_component_map(CompInfos, VMap, [{AtomName,Dec} | Acc]);
+decode_jer_component_map([{_Name, _AtomName, _Type, 'OPTIONAL'} | CompInfos], VMap, Acc) ->
+ decode_jer_component_map(CompInfos, VMap, Acc);
+decode_jer_component_map([{_Name, AtomName, _Type, {'DEFAULT',Dvalue}} | CompInfos], VMap, Acc) ->
+ decode_jer_component_map(CompInfos, VMap, [{AtomName, Dvalue} | Acc]);
+decode_jer_component_map([{Name, _AtomName, _Type, _OptOrDefault} | _CompInfos], VMap, _Acc) ->
+ exit({error,{asn1,{{decode,{mandatory_component_missing,Name}},VMap}}});
+decode_jer_component_map([], _, Acc) ->
+ %% not reusing the map from JSON decoder since it can contain non expected extra K,V pairs
+ maps:from_list(Acc).
+
%% This is the default representation of octet string i.e binary
json2octetstring2binary(Value) ->
list_to_binary(json2octetstring(Value,[])).