From e5bcee7b2c2d2ff873982c6a3bf39ab16ec4e1e3 Mon Sep 17 00:00:00 2001 From: acdenisSK Date: Wed, 4 Apr 2018 14:27:12 +0200 Subject: Fix is_empty behaviour again And fix some style issues. --- src/framework/standard/args.rs | 51 +++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) (limited to 'src/framework') 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(s: &mut String, delimiters: &[String]) -> Result(s: &mut String, delimiters: &[String]) -> Result } 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::().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::().map_err(Error::Parse)?; @@ -168,9 +167,13 @@ impl Args { /// ``` pub fn single(&mut self) -> Result where T::Err: StdError { + if self.is_empty() { + return Err(Error::Eos); + } + if let Some(ref mut val) = self.len { *val -= 1 - }; + } parse::(&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> = 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 { + 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(&mut self) -> Result 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::(&mut self.message, &self.delimiters) } @@ -397,7 +408,7 @@ impl Args { return Err(Error::Eos); } - IterQuoted::::new(&mut self).collect() + self.iter_quoted::().collect() } /// Like [`iter`], but takes quotes into account @@ -436,7 +447,7 @@ impl Args { return Err(Error::Eos); } - Iter::::new(&mut self).collect() + self.iter::().collect() } /// Provides an iterator of items: (`T: FromStr`) `Result`. -- cgit v1.2.3