@@ -43,7 +43,7 @@ impl<'a> Iterator for CmdlineIter<'a> {
43
43
type Item = Parameter < ' a > ;
44
44
45
45
fn next ( & mut self ) -> Option < Self :: Item > {
46
- let ( param, rest) = Parameter :: parse ( self . 0 ) ;
46
+ let ( param, rest) = Parameter :: parse_one ( self . 0 ) ;
47
47
self . 0 = rest;
48
48
param
49
49
}
@@ -77,7 +77,7 @@ impl<'a> Cmdline<'a> {
77
77
///
78
78
/// Returns the first parameter matching the given key, or `None` if not found.
79
79
/// Key comparison treats dashes and underscores as equivalent.
80
- pub fn find ( & ' a self , key : impl AsRef < [ u8 ] > ) -> Option < Parameter < ' a > > {
80
+ pub fn find < T : AsRef < [ u8 ] > + ? Sized > ( & ' a self , key : & T ) -> Option < Parameter < ' a > > {
81
81
let key = ParameterKey ( key. as_ref ( ) ) ;
82
82
self . iter ( ) . find ( |p| p. key == key)
83
83
}
@@ -90,7 +90,10 @@ impl<'a> Cmdline<'a> {
90
90
/// Otherwise, returns the first parameter matching the given key,
91
91
/// or `None` if not found. Key comparison treats dashes and
92
92
/// underscores as equivalent.
93
- pub fn find_utf8 ( & ' a self , key : impl AsRef < str > ) -> Result < Option < utf8:: Parameter < ' a > > > {
93
+ pub fn find_utf8 < T : AsRef < [ u8 ] > + ?Sized > (
94
+ & ' a self ,
95
+ key : & T ,
96
+ ) -> Result < Option < utf8:: Parameter < ' a > > > {
94
97
let bytes = match self . find ( key. as_ref ( ) ) {
95
98
Some ( p) => p,
96
99
None => return Ok ( None ) ,
@@ -114,14 +117,14 @@ impl<'a> Cmdline<'a> {
114
117
///
115
118
/// Returns the first value matching the given key, or `None` if not found.
116
119
/// Key comparison treats dashes and underscores as equivalent.
117
- pub fn value_of ( & ' a self , key : impl AsRef < [ u8 ] > ) -> Option < & ' a [ u8 ] > {
118
- self . find ( key) . and_then ( |p| p. value )
120
+ pub fn value_of < T : AsRef < [ u8 ] > + ? Sized > ( & ' a self , key : & T ) -> Option < & ' a [ u8 ] > {
121
+ self . find ( & key) . and_then ( |p| p. value )
119
122
}
120
123
121
124
/// Find the value of the kernel argument with the provided name, which must be present.
122
125
///
123
126
/// Otherwise the same as [`Self::value_of`].
124
- pub fn require_value_of ( & ' a self , key : impl AsRef < [ u8 ] > ) -> Result < & ' a [ u8 ] > {
127
+ pub fn require_value_of < T : AsRef < [ u8 ] > + ? Sized > ( & ' a self , key : & T ) -> Result < & ' a [ u8 ] > {
125
128
let key = key. as_ref ( ) ;
126
129
self . value_of ( key) . ok_or_else ( || {
127
130
let key = String :: from_utf8_lossy ( key) ;
@@ -135,7 +138,7 @@ impl<'a> Cmdline<'a> {
135
138
///
136
139
/// Returns `false` if the parameter already existed with the same
137
140
/// content.
138
- pub fn add_or_modify ( & mut self , param : Parameter ) -> bool {
141
+ pub fn add_or_modify ( & mut self , param : & Parameter ) -> bool {
139
142
let mut new_params = Vec :: new ( ) ;
140
143
let mut modified = false ;
141
144
let mut seen_key = false ;
@@ -145,7 +148,7 @@ impl<'a> Cmdline<'a> {
145
148
if !seen_key {
146
149
// This is the first time we've seen this key.
147
150
// We will replace it with the new parameter.
148
- if p != param {
151
+ if p != * param {
149
152
modified = true ;
150
153
}
151
154
new_params. push ( param. parameter ) ;
@@ -181,12 +184,12 @@ impl<'a> Cmdline<'a> {
181
184
/// Remove parameter(s) with the given key from the command line
182
185
///
183
186
/// Returns `true` if parameter(s) were removed.
184
- pub fn remove ( & mut self , key : ParameterKey ) -> bool {
187
+ pub fn remove ( & mut self , key : & ParameterKey ) -> bool {
185
188
let mut removed = false ;
186
189
let mut new_params = Vec :: new ( ) ;
187
190
188
191
for p in self . iter ( ) {
189
- if p. key == key {
192
+ if p. key == * key {
190
193
removed = true ;
191
194
} else {
192
195
new_params. push ( p. parameter ) ;
@@ -263,6 +266,18 @@ pub struct Parameter<'a> {
263
266
}
264
267
265
268
impl < ' a > Parameter < ' a > {
269
+ /// Attempt to parse a single command line parameter from a slice
270
+ /// of bytes.
271
+ ///
272
+ /// Returns `Some(Parameter)`, or `None` if a Parameter could not
273
+ /// be constructed from the input. This occurs when the input is
274
+ /// either empty or contains only whitespace.
275
+ ///
276
+ /// Any remaining bytes not consumed from the input are discarded.
277
+ pub fn parse < T : AsRef < [ u8 ] > + ?Sized > ( input : & ' a T ) -> Option < Self > {
278
+ Self :: parse_one ( input) . 0
279
+ }
280
+
266
281
/// Attempt to parse a single command line parameter from a slice
267
282
/// of bytes.
268
283
///
@@ -273,8 +288,8 @@ impl<'a> Parameter<'a> {
273
288
///
274
289
/// Any remaining bytes not consumed from the input are returned
275
290
/// as the second tuple item.
276
- pub fn parse ( input : & ' a [ u8 ] ) -> ( Option < Self > , & ' a [ u8 ] ) {
277
- let input = input. trim_ascii_start ( ) ;
291
+ pub fn parse_one < T : AsRef < [ u8 ] > + ? Sized > ( input : & ' a T ) -> ( Option < Self > , & ' a [ u8 ] ) {
292
+ let input = input. as_ref ( ) . trim_ascii_start ( ) ;
278
293
279
294
if input. is_empty ( ) {
280
295
return ( None , input) ;
@@ -352,33 +367,33 @@ mod tests {
352
367
353
368
// convenience methods for tests
354
369
fn param ( s : & str ) -> Parameter < ' _ > {
355
- Parameter :: parse ( s. as_bytes ( ) ) . 0 . unwrap ( )
370
+ Parameter :: parse ( s. as_bytes ( ) ) . unwrap ( )
356
371
}
357
372
358
373
fn param_utf8 ( s : & str ) -> utf8:: Parameter < ' _ > {
359
- utf8:: Parameter :: parse ( s) . 0 . unwrap ( )
374
+ utf8:: Parameter :: parse ( s) . unwrap ( )
360
375
}
361
376
362
377
#[ test]
363
- fn test_parameter_parse ( ) {
364
- let ( p, rest) = Parameter :: parse ( b"foo" ) ;
378
+ fn test_parameter_parse_one ( ) {
379
+ let ( p, rest) = Parameter :: parse_one ( b"foo" ) ;
365
380
let p = p. unwrap ( ) ;
366
381
assert_eq ! ( p. key. 0 , b"foo" ) ;
367
382
assert_eq ! ( p. value, None ) ;
368
383
assert_eq ! ( rest, "" . as_bytes( ) ) ;
369
384
370
385
// should consume one parameter and return the rest of the input
371
- let ( p, rest) = Parameter :: parse ( b"foo=bar baz" ) ;
386
+ let ( p, rest) = Parameter :: parse_one ( b"foo=bar baz" ) ;
372
387
let p = p. unwrap ( ) ;
373
388
assert_eq ! ( p. key. 0 , b"foo" ) ;
374
389
assert_eq ! ( p. value, Some ( b"bar" . as_slice( ) ) ) ;
375
390
assert_eq ! ( rest, " baz" . as_bytes( ) ) ;
376
391
377
392
// should return None on empty or whitespace inputs
378
- let ( p, rest) = Parameter :: parse ( b"" ) ;
393
+ let ( p, rest) = Parameter :: parse_one ( b"" ) ;
379
394
assert ! ( p. is_none( ) ) ;
380
395
assert_eq ! ( rest, b"" . as_slice( ) ) ;
381
- let ( p, rest) = Parameter :: parse ( b" " ) ;
396
+ let ( p, rest) = Parameter :: parse_one ( b" " ) ;
382
397
assert ! ( p. is_none( ) ) ;
383
398
assert_eq ! ( rest, b"" . as_slice( ) ) ;
384
399
}
@@ -415,7 +430,7 @@ mod tests {
415
430
416
431
#[ test]
417
432
fn test_parameter_internal_key_whitespace ( ) {
418
- let ( p, rest) = Parameter :: parse ( "foo bar=baz" . as_bytes ( ) ) ;
433
+ let ( p, rest) = Parameter :: parse_one ( "foo bar=baz" . as_bytes ( ) ) ;
419
434
let p = p. unwrap ( ) ;
420
435
assert_eq ! ( p. key. 0 , b"foo" ) ;
421
436
assert_eq ! ( p. value, None ) ;
@@ -441,8 +456,7 @@ mod tests {
441
456
assert ! ( failed_conversion. is_err( ) ) ;
442
457
let mut p = b"foo=" . to_vec ( ) ;
443
458
p. push ( non_utf8_byte[ 0 ] ) ;
444
- let ( p, _rest) = Parameter :: parse ( & p) ;
445
- let p = p. unwrap ( ) ;
459
+ let p = Parameter :: parse ( & p) . unwrap ( ) ;
446
460
assert_eq ! ( p. value, Some ( non_utf8_byte. as_slice( ) ) ) ;
447
461
}
448
462
@@ -630,22 +644,22 @@ mod tests {
630
644
let mut kargs = Cmdline :: from ( b"foo=bar" ) ;
631
645
632
646
// add new
633
- assert ! ( kargs. add_or_modify( param( "baz" ) ) ) ;
647
+ assert ! ( kargs. add_or_modify( & param( "baz" ) ) ) ;
634
648
let mut iter = kargs. iter ( ) ;
635
649
assert_eq ! ( iter. next( ) , Some ( param( "foo=bar" ) ) ) ;
636
650
assert_eq ! ( iter. next( ) , Some ( param( "baz" ) ) ) ;
637
651
assert_eq ! ( iter. next( ) , None ) ;
638
652
639
653
// modify existing
640
- assert ! ( kargs. add_or_modify( param( "foo=fuz" ) ) ) ;
654
+ assert ! ( kargs. add_or_modify( & param( "foo=fuz" ) ) ) ;
641
655
iter = kargs. iter ( ) ;
642
656
assert_eq ! ( iter. next( ) , Some ( param( "foo=fuz" ) ) ) ;
643
657
assert_eq ! ( iter. next( ) , Some ( param( "baz" ) ) ) ;
644
658
assert_eq ! ( iter. next( ) , None ) ;
645
659
646
660
// already exists with same value returns false and doesn't
647
661
// modify anything
648
- assert ! ( !kargs. add_or_modify( param( "foo=fuz" ) ) ) ;
662
+ assert ! ( !kargs. add_or_modify( & param( "foo=fuz" ) ) ) ;
649
663
iter = kargs. iter ( ) ;
650
664
assert_eq ! ( iter. next( ) , Some ( param( "foo=fuz" ) ) ) ;
651
665
assert_eq ! ( iter. next( ) , Some ( param( "baz" ) ) ) ;
@@ -655,14 +669,14 @@ mod tests {
655
669
#[ test]
656
670
fn test_add_or_modify_empty_cmdline ( ) {
657
671
let mut kargs = Cmdline :: from ( b"" ) ;
658
- assert ! ( kargs. add_or_modify( param( "foo" ) ) ) ;
672
+ assert ! ( kargs. add_or_modify( & param( "foo" ) ) ) ;
659
673
assert_eq ! ( kargs. 0 , b"foo" . as_slice( ) ) ;
660
674
}
661
675
662
676
#[ test]
663
677
fn test_add_or_modify_duplicate_parameters ( ) {
664
678
let mut kargs = Cmdline :: from ( b"a=1 a=2" ) ;
665
- assert ! ( kargs. add_or_modify( param( "a=3" ) ) ) ;
679
+ assert ! ( kargs. add_or_modify( & param( "a=3" ) ) ) ;
666
680
let mut iter = kargs. iter ( ) ;
667
681
assert_eq ! ( iter. next( ) , Some ( param( "a=3" ) ) ) ;
668
682
assert_eq ! ( iter. next( ) , None ) ;
@@ -673,14 +687,14 @@ mod tests {
673
687
let mut kargs = Cmdline :: from ( b"foo bar baz" ) ;
674
688
675
689
// remove existing
676
- assert ! ( kargs. remove( "bar" . into( ) ) ) ;
690
+ assert ! ( kargs. remove( & "bar" . into( ) ) ) ;
677
691
let mut iter = kargs. iter ( ) ;
678
692
assert_eq ! ( iter. next( ) , Some ( param( "foo" ) ) ) ;
679
693
assert_eq ! ( iter. next( ) , Some ( param( "baz" ) ) ) ;
680
694
assert_eq ! ( iter. next( ) , None ) ;
681
695
682
696
// doesn't exist? returns false and doesn't modify anything
683
- assert ! ( !kargs. remove( "missing" . into( ) ) ) ;
697
+ assert ! ( !kargs. remove( & "missing" . into( ) ) ) ;
684
698
iter = kargs. iter ( ) ;
685
699
assert_eq ! ( iter. next( ) , Some ( param( "foo" ) ) ) ;
686
700
assert_eq ! ( iter. next( ) , Some ( param( "baz" ) ) ) ;
@@ -690,7 +704,7 @@ mod tests {
690
704
#[ test]
691
705
fn test_remove_duplicates ( ) {
692
706
let mut kargs = Cmdline :: from ( b"a=1 b=2 a=3" ) ;
693
- assert ! ( kargs. remove( "a" . into( ) ) ) ;
707
+ assert ! ( kargs. remove( & "a" . into( ) ) ) ;
694
708
let mut iter = kargs. iter ( ) ;
695
709
assert_eq ! ( iter. next( ) , Some ( param( "b=2" ) ) ) ;
696
710
assert_eq ! ( iter. next( ) , None ) ;
0 commit comments