@@ -648,41 +648,51 @@ translate_terminus_durability(none) -> 0;
648648translate_terminus_durability (configuration ) -> 1 ;
649649translate_terminus_durability (unsettled_state ) -> 2 .
650650
651- translate_filters (Filters ) when is_map (Filters ) andalso map_size (Filters ) =< 0 -> undefined ;
652- translate_filters (Filters ) when is_map (Filters ) -> {
653- map ,
654- maps :fold (
655- fun (<<" apache.org:legacy-amqp-direct-binding:string" >> = K , V , Acc ) when is_binary (V ) ->
656- [{{symbol , K }, {described , {symbol , K }, {utf8 , V }}} | Acc ];
657- (<<" apache.org:legacy-amqp-topic-binding:string" >> = K , V , Acc ) when is_binary (V ) ->
658- [{{symbol , K }, {described , {symbol , K }, {utf8 , V }}} | Acc ];
659- (<<" apache.org:legacy-amqp-headers-binding:map" >> = K , V , Acc ) when is_map (V ) ->
660- [{{symbol , K }, {described , {symbol , K }, translate_legacy_amqp_headers_binding (V )}} | Acc ];
661- (<<" apache.org:no-local-filter:list" >> = K , V , Acc ) when is_list (V ) ->
662- [{{symbol , K }, {described , {symbol , K }, lists :map (fun (Id ) -> {utf8 , Id } end , V )}} | Acc ];
663- (<<" apache.org:selector-filter:string" >> = K , V , Acc ) when is_binary (V ) ->
664- [{{symbol , K }, {described , {symbol , K }, {utf8 , V }}} | Acc ]
665- end ,
666- [],
667- Filters )
668- }.
651+ translate_filters (Filters )
652+ when is_map (Filters ) andalso
653+ map_size (Filters ) == 0 ->
654+ undefined ;
655+ translate_filters (Filters )
656+ when is_map (Filters ) ->
657+ {map ,
658+ maps :fold (
659+ fun
660+ (<<" apache.org:legacy-amqp-headers-binding:map" >> = K , V , Acc ) when is_map (V ) ->
661+ % % special case conversion
662+ Key = sym (K ),
663+ [{Key , {described , Key , translate_legacy_amqp_headers_binding (V )}} | Acc ];
664+ (K , V , Acc ) when is_binary (K ) ->
665+ % % try treat any filter value generically
666+ Key = sym (K ),
667+ Value = filter_value_type (V ),
668+ [{Key , {described , Key , Value }} | Acc ]
669+ end , [], Filters )}.
670+
671+ filter_value_type (V ) when is_binary (V ) ->
672+ % % this is clearly not always correct
673+ {utf8 , V };
674+ filter_value_type (V )
675+ when is_integer (V ) andalso V >= 0 ->
676+ {uint , V };
677+ filter_value_type (VList ) when is_list (VList ) ->
678+ [filter_value_type (V ) || V <- VList ];
679+ filter_value_type ({T , _ } = V ) when is_atom (T ) ->
680+ % % looks like an already tagged type, just pass it through
681+ V .
669682
670683% https://people.apache.org/~rgodfrey/amqp-1.0/apache-filters.html
671- translate_legacy_amqp_headers_binding (LegacyHeaders ) -> {
672- map ,
673- maps :fold (
674- fun (<<" x-match" >> = K , <<" any" >> = V , Acc ) ->
675- [{{utf8 , K }, {utf8 , V }} | Acc ];
676- (<<" x-match" >> = K , <<" all" >> = V , Acc ) ->
677- [{{utf8 , K }, {utf8 , V }} | Acc ];
678- (<<" x-" ,_ /binary >>, _ , Acc ) ->
679- Acc ;
680- (K , V , Acc ) ->
681- [{{utf8 , K }, {utf8 , V }} | Acc ]
682- end ,
683- [],
684- LegacyHeaders )
685- }.
684+ translate_legacy_amqp_headers_binding (LegacyHeaders ) ->
685+ {map ,
686+ maps :fold (
687+ fun (<<" x-match" >> = K , <<" any" >> = V , Acc ) ->
688+ [{{utf8 , K }, {utf8 , V }} | Acc ];
689+ (<<" x-match" >> = K , <<" all" >> = V , Acc ) ->
690+ [{{utf8 , K }, {utf8 , V }} | Acc ];
691+ (<<" x-" , _ /binary >>, _ , Acc ) ->
692+ Acc ;
693+ (K , V , Acc ) ->
694+ [{{utf8 , K }, filter_value_type (V )} | Acc ]
695+ end , [], LegacyHeaders )}.
686696
687697send_detach (Send , {detach , OutHandle }, _From , State = # state {links = Links }) ->
688698 case Links of
@@ -1011,8 +1021,10 @@ wrap_map_value(V) when is_atom(V) ->
10111021 utf8 (atom_to_list (V )).
10121022
10131023utf8 (V ) -> amqp10_client_types :utf8 (V ).
1024+
1025+ sym (B ) when is_binary (B ) -> {symbol , B };
10141026sym (B ) when is_list (B ) -> {symbol , list_to_binary (B )};
1015- sym (B ) when is_binary (B ) -> {symbol , B }.
1027+ sym (B ) when is_atom (B ) -> {symbol , atom_to_binary ( B , utf8 ) }.
10161028
10171029- ifdef (TEST ).
10181030- include_lib (" eunit/include/eunit.hrl" ).
0 commit comments