diff options
author | Anders Svensson <[email protected]> | 2017-04-30 10:30:59 +0200 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2017-06-13 13:50:07 +0200 |
commit | 84dbccad048374e3eb1ec7372fd177eba022d108 (patch) | |
tree | ec209217c96f23d9327e08da35f721b08a23cc38 /lib/diameter/include/diameter_gen.hrl | |
parent | 9d08b9d8d9d500259eeb808af19f9cf3d8d79fdf (diff) | |
download | otp-84dbccad048374e3eb1ec7372fd177eba022d108.tar.gz otp-84dbccad048374e3eb1ec7372fd177eba022d108.tar.bz2 otp-84dbccad048374e3eb1ec7372fd177eba022d108.zip |
Add diameter_codec option ordered_encode
To allow list-valued messaged to be encoded in the specified order,
instead of in the dictionary order by first converting the list to a
record. This is not yet exposed in configuration.
Diffstat (limited to 'lib/diameter/include/diameter_gen.hrl')
-rw-r--r-- | lib/diameter/include/diameter_gen.hrl | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/diameter/include/diameter_gen.hrl b/lib/diameter/include/diameter_gen.hrl index 1683d93557..83f87ea4c4 100644 --- a/lib/diameter/include/diameter_gen.hrl +++ b/lib/diameter/include/diameter_gen.hrl @@ -43,35 +43,39 @@ %% # encode_avps/3 %% --------------------------------------------------------------------------- --spec encode_avps(parent_name(), parent_record() | avp_values(), term()) +-spec encode_avps(parent_name(), parent_record() | avp_values(), map()) -> iolist() | no_return(). -encode_avps(Name, Vals, Opts) - when is_list(Vals) -> - encode_avps(Name, '#set-'(Vals, newrec(Name)), Opts); - -encode_avps(Name, Rec, Opts) -> +encode_avps(Name, Vals, Opts) -> try - encode(Name, Rec, Opts) + encode(Name, Vals, Opts) catch throw: {?MODULE, Reason} -> diameter_lib:log({encode, error}, ?MODULE, ?LINE, - {Reason, Name, Rec}), + {Reason, Name, Vals}), erlang:error(list_to_tuple(Reason ++ [Name])); error: Reason -> Stack = erlang:get_stacktrace(), diameter_lib:log({encode, failure}, ?MODULE, ?LINE, - {Reason, Name, Rec, Stack}), + {Reason, Name, Vals, Stack}), erlang:error({encode_failure, Reason, Name, Stack}) end. %% encode/3 +encode(Name, Vals, #{ordered_encode := false} = Opts) + when is_list(Vals) -> + lists:map(fun({F,V}) -> encode(Name, F, V, Opts) end, Vals); + +encode(Name, Vals, Opts) + when is_list(Vals) -> + encode(Name, '#set-'(Vals, newrec(Name)), Opts); + encode(Name, Rec, Opts) -> [encode(Name, F, V, Opts) || {F,V} <- '#get-'(Rec)]. @@ -671,4 +675,4 @@ z(Name) -> %% --------------------------------------------------------------------------- empty(AvpName) -> - avp(encode, zero, AvpName, _Opts = []). + avp(encode, zero, AvpName, _Opts = #{}). |