aboutsummaryrefslogtreecommitdiff
path: root/src/framework
diff options
context:
space:
mode:
authoracdenisSK <[email protected]>2017-10-10 21:00:17 +0200
committeracdenisSK <[email protected]>2017-10-10 21:00:17 +0200
commit0ed19727debf28a8aa0818b44713090e97dd6eee (patch)
treed5502f6aff2ddcbc497b1cbfb9ac889171110c94 /src/framework
parentAdd some docs to `Args` (diff)
downloadserenity-0ed19727debf28a8aa0818b44713090e97dd6eee.tar.xz
serenity-0ed19727debf28a8aa0818b44713090e97dd6eee.zip
Add an iterator for `Args`
Diffstat (limited to 'src/framework')
-rw-r--r--src/framework/standard/args.rs42
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>())
+ }
+ }
+}