aboutsummaryrefslogtreecommitdiff
path: root/src/framework
diff options
context:
space:
mode:
authoracdenisSK <[email protected]>2018-04-04 14:27:12 +0200
committeracdenisSK <[email protected]>2018-04-04 14:27:12 +0200
commite5bcee7b2c2d2ff873982c6a3bf39ab16ec4e1e3 (patch)
tree6d09de9b17631e40ea3dad1576edffcd6395df81 /src/framework
parentFix nsfw related docs (#299) (diff)
downloadserenity-e5bcee7b2c2d2ff873982c6a3bf39ab16ec4e1e3.tar.xz
serenity-e5bcee7b2c2d2ff873982c6a3bf39ab16ec4e1e3.zip
Fix is_empty behaviour again
And fix some style issues.
Diffstat (limited to 'src/framework')
-rw-r--r--src/framework/standard/args.rs51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/framework/standard/args.rs b/src/framework/standard/args.rs
index 305bc5f..1c8d075 100644
--- a/src/framework/standard/args.rs
+++ b/src/framework/standard/args.rs
@@ -72,7 +72,6 @@ fn parse_quotes<T: FromStr>(s: &mut String, delimiters: &[String]) -> Result<T,
pos += '"'.len_utf8();
for delimiter in delimiters {
-
if s[pos..].starts_with(delimiter) {
pos += delimiter.len();
break;
@@ -96,27 +95,27 @@ fn parse<T: FromStr>(s: &mut String, delimiters: &[String]) -> Result<T, T::Err>
}
if delimiters.len() == 1 {
- let mut pos = s.find(&delimiters[0]).unwrap_or_else(|| s.len());
+ let delim = &delimiters[0];
+ let mut pos = s.find(delim).unwrap_or_else(|| s.len());
let res = (&s[..pos]).parse::<T>().map_err(Error::Parse)?;
if pos < s.len() {
- pos += delimiters[0].len();
+ pos += delim.len();
}
s.drain(..pos);
Ok(res)
} else {
- let mut smallest_pos = s.len();
- let mut delimiter_len: usize = 0;
-
- for delimiter in delimiters {
- let other_pos = s.find(delimiter).unwrap_or_else(|| s.len());
+ let (mut smallest_pos, delimiter_len) = delimiters.iter().fold((s.len(), 0usize), |mut acc, delim| {
+ let other_pos = s.find(delim).unwrap_or_else(|| s.len());
- if smallest_pos > other_pos {
- smallest_pos = other_pos;
- delimiter_len = delimiter.len();
+ if acc.0 > other_pos {
+ acc.0 = other_pos;
+ acc.1 = delim.len();
}
- }
+
+ acc
+ });
let res = (&s[..smallest_pos]).parse::<T>().map_err(Error::Parse)?;
@@ -168,9 +167,13 @@ impl Args {
/// ```
pub fn single<T: FromStr>(&mut self) -> Result<T, T::Err>
where T::Err: StdError {
+ if self.is_empty() {
+ return Err(Error::Eos);
+ }
+
if let Some(ref mut val) = self.len {
*val -= 1
- };
+ }
parse::<T>(&mut self.message, &self.delimiters)
}
@@ -222,7 +225,7 @@ impl Args {
if let Some(len) = self.len {
len
} else if self.is_empty() {
- 0
+ 0
} else {
let mut words: Box<Iterator<Item = &str>> = Box::new(Some(&self.message[..]).into_iter());
@@ -264,9 +267,9 @@ impl Args {
/// ```
pub fn len_quoted(&mut self) -> usize {
if self.is_empty() {
- 0
+ 0
} else if let Some(len_quoted) = self.len_quoted {
- len_quoted
+ len_quoted
} else {
let countable_self = self.clone();
@@ -291,6 +294,10 @@ impl Args {
/// assert_eq!(args.full(), "69");
/// ```
pub fn skip(&mut self) -> Option<String> {
+ if self.is_empty() {
+ return None;
+ }
+
if let Some(ref mut val) = self.len {
if 1 <= *val {
*val -= 1
@@ -331,7 +338,7 @@ impl Args {
} else {
*val = 0
}
- };
+ }
Some(vec)
}
@@ -352,9 +359,13 @@ impl Args {
/// [`single`]: #method.single
pub fn single_quoted<T: FromStr>(&mut self) -> Result<T, T::Err>
where T::Err: StdError {
+ if self.is_empty() {
+ return Err(Error::Eos);
+ }
+
if let Some(ref mut val) = self.len_quoted {
*val -= 1
- };
+ }
parse_quotes::<T>(&mut self.message, &self.delimiters)
}
@@ -397,7 +408,7 @@ impl Args {
return Err(Error::Eos);
}
- IterQuoted::<T>::new(&mut self).collect()
+ self.iter_quoted::<T>().collect()
}
/// Like [`iter`], but takes quotes into account
@@ -436,7 +447,7 @@ impl Args {
return Err(Error::Eos);
}
- Iter::<T>::new(&mut self).collect()
+ self.iter::<T>().collect()
}
/// Provides an iterator of items: (`T: FromStr`) `Result<T, T::Err>`.