@@ -294,6 +294,29 @@ impl<'a> Cmdline<'a> {
294294 removed
295295 }
296296
297+ /// Remove all parameters that exactly match the given parameter
298+ /// from the command line
299+ ///
300+ /// Returns `true` if parameter(s) were removed.
301+ pub fn remove_exact ( & mut self , param : & Parameter ) -> bool {
302+ let mut removed = false ;
303+ let mut new_params = Vec :: new ( ) ;
304+
305+ for p in self . iter ( ) {
306+ if p == * param {
307+ removed = true ;
308+ } else {
309+ new_params. push ( p. parameter ) ;
310+ }
311+ }
312+
313+ if removed {
314+ self . 0 = Cow :: Owned ( new_params. join ( b" " . as_slice ( ) ) ) ;
315+ }
316+
317+ removed
318+ }
319+
297320 #[ cfg( test) ]
298321 pub ( crate ) fn is_owned ( & self ) -> bool {
299322 matches ! ( self . 0 , Cow :: Owned ( _) )
@@ -904,6 +927,25 @@ mod tests {
904927 assert_eq ! ( iter. next( ) , None ) ;
905928 }
906929
930+ #[ test]
931+ fn test_remove_exact ( ) {
932+ let mut kargs = Cmdline :: from ( b"foo foo=bar foo=baz" ) ;
933+
934+ // remove existing
935+ assert ! ( kargs. remove_exact( & param( "foo=bar" ) ) ) ;
936+ let mut iter = kargs. iter ( ) ;
937+ assert_eq ! ( iter. next( ) , Some ( param( "foo" ) ) ) ;
938+ assert_eq ! ( iter. next( ) , Some ( param( "foo=baz" ) ) ) ;
939+ assert_eq ! ( iter. next( ) , None ) ;
940+
941+ // doesn't exist? returns false and doesn't modify anything
942+ assert ! ( !kargs. remove_exact( & param( "foo=wuz" ) ) ) ;
943+ iter = kargs. iter ( ) ;
944+ assert_eq ! ( iter. next( ) , Some ( param( "foo" ) ) ) ;
945+ assert_eq ! ( iter. next( ) , Some ( param( "foo=baz" ) ) ) ;
946+ assert_eq ! ( iter. next( ) , None ) ;
947+ }
948+
907949 #[ test]
908950 fn test_extend ( ) {
909951 let mut kargs = Cmdline :: from ( b"foo=bar baz" ) ;
0 commit comments