diff --git a/src/lib.rs b/src/lib.rs index fc43d66..adffdfd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -123,6 +123,23 @@ pub mod buf { } } + impl<'a, R, T> Push for &'a mut R + where + R: Push, + { + fn push_checked(&mut self, item: T) -> Result<(), OutOfSpace> { + (**self).push_checked(item) + } + + fn push(&mut self, item: T) { + (**self).push(item) + } + + unsafe fn push_unchecked(&mut self, item: T) { + (**self).push(item) + } + } + pub struct OutOfSpace; pub trait Push { fn push_checked(&mut self, item: T) -> Result<(), OutOfSpace> { @@ -332,12 +349,13 @@ pub mod cli { 'b, A: AsRef, B: From<&'b str>, - P: Push, + PB: Push, + PE: Push, >( &mut self, args: &'b [A], - mut out: Option<&mut Vec>, - mut errors: Option<&mut P>, + mut out: PB, + mut errors: PE, ) { let mut it = args.iter(); fn next_param<'a, A: AsRef + 'a>( @@ -400,24 +418,21 @@ pub mod cli { }, } } else { - if let Some(out) = out.as_mut() { - out.push(arg.as_ref().into()); - } + out.push(arg.as_ref().into()); Ok(()) } }; - if let (Some(err), Some(errors)) = (go().err(), errors.as_mut()) - { + if let Some(err) = go().err() { errors.push(err); } } } - pub fn parse_env>( + pub fn parse_env, PE: Push>( &mut self, - out: Option<&mut Vec>, - errors: Option<&mut P>, + out: PS, + errors: PE, ) { let env_args = std::env::args().collect::>(); self.parse(env_args.as_slice(), out, errors); @@ -514,8 +529,8 @@ pub mod cli { let mut errors = Buf::new(1); cli.parse( &["--foo", "foo", "--bar", "854", "-b", "arg"], - Some(&mut args), - Some(&mut errors), + &mut args, + &mut errors, ); assert_eq!(foo, "foo"); assert_eq!(bar, 854);