@@ -8,6 +8,8 @@ use std::collections::HashSet;
88use std:: convert:: TryInto ;
99use std:: fmt:: Display ;
1010use std:: fmt:: Formatter ;
11+ use std:: ops:: Add ;
12+ use std:: ops:: AddAssign ;
1113
1214/// An MQTT topic
1315#[ derive( Debug , Clone , Eq , PartialEq , Deserialize , Serialize ) ]
@@ -93,14 +95,10 @@ impl TopicFilter {
9395 }
9496
9597 /// Check if the pattern is valid and add it to this topic filter.
96- pub fn add ( & mut self , pattern : & str ) -> Result < ( ) , MqttError > {
97- let pattern = String :: from ( pattern) ;
98- if rumqttc:: valid_filter ( & pattern) {
99- self . patterns . push ( pattern) ;
100- Ok ( ( ) )
101- } else {
102- Err ( MqttError :: InvalidFilter { pattern } )
103- }
98+ pub fn try_add ( & mut self , pattern : & str ) -> Result < ( ) , MqttError > {
99+ let other = TopicFilter :: new ( pattern) ?;
100+ * self += other;
101+ Ok ( ( ) )
104102 }
105103
106104 /// Assuming the pattern is valid and add it to this topic filter.
@@ -240,7 +238,7 @@ impl TryInto<TopicFilter> for Vec<&str> {
240238 fn try_into ( self ) -> Result < TopicFilter , Self :: Error > {
241239 let mut filter = TopicFilter :: empty ( ) ;
242240 for pattern in self . into_iter ( ) {
243- filter. add ( pattern) ?
241+ filter. try_add ( pattern) ?
244242 }
245243 Ok ( filter)
246244 }
@@ -258,7 +256,7 @@ impl TryInto<TopicFilter> for Vec<String> {
258256 fn try_into ( self ) -> Result < TopicFilter , Self :: Error > {
259257 let mut filter = TopicFilter :: empty ( ) ;
260258 for pattern in self . into_iter ( ) {
261- filter. add ( pattern. as_str ( ) ) ?
259+ filter. try_add ( pattern. as_str ( ) ) ?
262260 }
263261 Ok ( filter)
264262 }
@@ -270,13 +268,28 @@ impl AsRef<str> for Topic {
270268 }
271269}
272270
271+ impl Add for TopicFilter {
272+ type Output = TopicFilter ;
273+
274+ fn add ( mut self , other : TopicFilter ) -> TopicFilter {
275+ self += other;
276+ self
277+ }
278+ }
279+
280+ impl AddAssign for TopicFilter {
281+ fn add_assign ( & mut self , rhs : Self ) {
282+ self . add_all ( rhs) ;
283+ }
284+ }
285+
273286impl TryInto < TopicFilter > for HashSet < String > {
274287 type Error = MqttError ;
275288
276289 fn try_into ( self ) -> Result < TopicFilter , Self :: Error > {
277290 let mut filter = TopicFilter :: empty ( ) ;
278291 for pattern in self . into_iter ( ) {
279- filter. add ( pattern. as_str ( ) ) ?
292+ filter. try_add ( pattern. as_str ( ) ) ?
280293 }
281294 Ok ( filter)
282295 }
@@ -345,4 +358,23 @@ mod tests {
345358 let removed = topics. remove_overlapping_patterns ( ) ;
346359 assert ! ( removed. is_empty( ) ) ;
347360 }
361+
362+ #[ test]
363+ fn test_adding_topic_filters ( ) {
364+ let filter1 = TopicFilter :: new_unchecked ( "a/b/c" ) ;
365+ let filter2 = TopicFilter :: new_unchecked ( "d/e/f" ) ;
366+
367+ let combined = filter1. clone ( ) + filter2. clone ( ) ;
368+ assert ! ( combined. accept_topic_name( "a/b/c" ) ) ;
369+ assert ! ( combined. accept_topic_name( "d/e/f" ) ) ;
370+ }
371+
372+ #[ test]
373+ fn test_add_assign_topic_filters ( ) {
374+ let mut filter = TopicFilter :: new_unchecked ( "a/b/c" ) ;
375+ filter += TopicFilter :: new_unchecked ( "d/e/f" ) ;
376+
377+ assert ! ( filter. accept_topic_name( "a/b/c" ) ) ;
378+ assert ! ( filter. accept_topic_name( "d/e/f" ) ) ;
379+ }
348380}
0 commit comments