diff options
| author | acdenisSK <[email protected]> | 2017-10-10 21:00:17 +0200 |
|---|---|---|
| committer | acdenisSK <[email protected]> | 2017-10-10 21:00:17 +0200 |
| commit | 0ed19727debf28a8aa0818b44713090e97dd6eee (patch) | |
| tree | d5502f6aff2ddcbc497b1cbfb9ac889171110c94 /src/framework | |
| parent | Add some docs to `Args` (diff) | |
| download | serenity-0ed19727debf28a8aa0818b44713090e97dd6eee.tar.xz serenity-0ed19727debf28a8aa0818b44713090e97dd6eee.zip | |
Add an iterator for `Args`
Diffstat (limited to 'src/framework')
| -rw-r--r-- | src/framework/standard/args.rs | 42 |
1 files changed, 33 insertions, 9 deletions
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<T: FromStr>(self) -> Result<Vec<T>, T::Err> + pub fn list<T: FromStr>(mut self) -> Result<Vec<T>, 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::<T>().map_err(Error::Parse)) - .collect() + Iter::<T>::new(&mut self).collect() + } + + /// Provides an iterator of items: (`T: FromStr`) `Result<T, T::Err>`. + pub fn iter<T: FromStr>(&mut self) -> Iter<T> 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<T>, +} + +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<T, T::Err>; + + fn next(&mut self) -> Option<Self::Item> { + if self.args.is_empty() { + None + } else { + Some(self.args.single::<T>()) + } + } +} |