diff options
-rw-r--r-- | lib/diameter/src/base/diameter.erl | 6 | ||||
-rw-r--r-- | lib/diameter/src/base/diameter_config.erl | 3 | ||||
-rw-r--r-- | lib/diameter/src/base/diameter_gen.erl | 13 |
3 files changed, 16 insertions, 6 deletions
diff --git a/lib/diameter/src/base/diameter.erl b/lib/diameter/src/base/diameter.erl index 75deaad511..85a54c8e61 100644 --- a/lib/diameter/src/base/diameter.erl +++ b/lib/diameter/src/base/diameter.erl @@ -332,7 +332,11 @@ call(SvcName, App, Message) -> :: 0..16#FFFFFF. -type decode_format() - :: record | list | map | false. + :: record + | list + | map + | false + | record_from_map. %% Options passed to start_service/2 diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl index 09018308d5..d591fa903e 100644 --- a/lib/diameter/src/base/diameter_config.erl +++ b/lib/diameter/src/base/diameter_config.erl @@ -771,7 +771,8 @@ opt(K, true = B) opt(decode_format, T) when T == record; T == list; - T == map -> + T == map; + T == record_from_map -> T; opt(restrict_connections, T) diff --git a/lib/diameter/src/base/diameter_gen.erl b/lib/diameter/src/base/diameter_gen.erl index 239d4a535f..78d8bd2fa3 100644 --- a/lib/diameter/src/base/diameter_gen.erl +++ b/lib/diameter/src/base/diameter_gen.erl @@ -186,7 +186,7 @@ decode_avps(Name, Recs, #{module := Mod, decode_format := Fmt} = Opts) -> %% AM counts the number of top-level AVPs, which missing/4 then %% uses when adding 5005 errors. Arities = Mod:avp_arity(Name), - {reformat(Rec, Arities, Fmt), + {reformat(Rec, Arities, Mod, Fmt), Avps, Failed ++ missing(Arities, Opts, Mod, AM)}. @@ -760,12 +760,17 @@ newrec(_, Name, _) -> newrec(Mod, Name) -> Mod:'#new-'(Mod:name2rec(Name)). -%% reformat/3 +%% reformat/4 -reformat(Map, Arities, list) -> +reformat(Map, Arities, _Mod, list) -> [{F,V} || {F,_} <- Arities, #{F := V} <- [Map]]; -reformat(Rec, _, _) -> +reformat(Map, Arities, Mod, record_from_map) -> + #{':name' := Name} = Map, + RecName = Mod:name2rec(Name), + list_to_tuple([RecName | [maps:get(F, Map, def(A)) || {F,A} <- Arities]]); + +reformat(Rec, _, _, _) -> Rec. %% def/1 |