From 0ed19727debf28a8aa0818b44713090e97dd6eee Mon Sep 17 00:00:00 2001 From: acdenisSK Date: Tue, 10 Oct 2017 21:00:17 +0200 Subject: Add an iterator for `Args` --- src/framework/standard/args.rs | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'src/framework') diff --git a/src/framework/standard/args.rs b/src/framework/standard/args.rs index d773c6b..82a9e3f 100644 --- a/src/framework/standard/args.rs +++ b/src/framework/standard/args.rs @@ -160,16 +160,14 @@ impl Args { } /// Empty outs the internal vector while parsing (if necessary) and returning them - pub fn list(self) -> Result, T::Err> + pub fn list(mut self) -> Result, T::Err> where T::Err: StdError { - if self.delimiter_split.is_empty() { - return Err(Error::Eos); - } - - self.delimiter_split - .into_iter() - .map(|s| s.parse::().map_err(Error::Parse)) - .collect() + Iter::::new(&mut self).collect() + } + + /// Provides an iterator of items: (`T: FromStr`) `Result`. + pub fn iter(&mut self) -> Iter where T::Err: StdError { + Iter::new(self) } /// This method is just `internal_vector.join(delimiter)` @@ -220,3 +218,29 @@ impl ::std::ops::Deref for Args { fn deref(&self) -> &Self::Target { &self.delimiter_split } } + +use std::marker::PhantomData; + +/// Provides `list`'s functionality, but as an iterator. +pub struct Iter<'a, T: FromStr> where T::Err: StdError { + args: &'a mut Args, + _marker: PhantomData, +} + +impl<'a, T: FromStr> Iter<'a, T> where T::Err: StdError { + fn new(args: &'a mut Args) -> Self { + Iter { args, _marker: PhantomData } + } +} + +impl<'a, T: FromStr> Iterator for Iter<'a, T> where T::Err: StdError { + type Item = Result; + + fn next(&mut self) -> Option { + if self.args.is_empty() { + None + } else { + Some(self.args.single::()) + } + } +} -- cgit v1.2.3