From 346c17c517a010b862c1f08fa552634444d7bced Mon Sep 17 00:00:00 2001 From: Zach Dziura Date: Thu, 28 May 2015 21:04:00 +0000 Subject: [PATCH] Actually finished lexer integration There were some previous bugs in the original lexer implementation that had to be fixed, along with some extraneous code that had to be removed. Luckily, that's all been taken care of! --- src/lexer.rs | 59 ++++++++++++++++++++++++++++++---------------------- src/lib.rs | 1 + 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index be5b4db..823ed93 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -31,7 +31,7 @@ pub fn collect(input: &[&str]) -> Result, Error> { Ok(vector) } -fn analyze(input: &str) -> Result { +pub fn analyze(input: &str) -> Result { let mut token = Token::new(); token.is_arg = match &input[..1] { @@ -48,35 +48,34 @@ fn analyze(input: &str) -> Result { return Err(Error::new(ErrorKind::OptionFormat, String::from(input))); } - let option = &input[1..(input.len() - 1)]; + let option = if token.is_arg { + &input[1..] + } else if token.has_arg { + &input[..(input.len() - 1)] + } else { + input + }; let mut current_stage = AnalysisStage::ShortName; - let mut char_iter = option.chars(); - let mut current_char = char_iter.next(); - while current_char.is_some() { - let c = current_char.unwrap(); + for c in option.chars() { match c { - '/' => { - current_stage = AnalysisStage::LongName; - continue; - }, - '(' => { - current_stage = AnalysisStage::Description; - continue; - }, - ')' => break, - _ => () + '/' => current_stage = AnalysisStage::LongName, + '(' => current_stage = AnalysisStage::Description, + ')' => (), + _ => { + match current_stage { + AnalysisStage::ShortName => token.short_name.push(c), + AnalysisStage::LongName => token.long_name.push(c), + AnalysisStage::Description => token.description.push(c) + } + } } - - match current_stage { - AnalysisStage::ShortName => token.short_name.push(c), - AnalysisStage::LongName => token.long_name.push(c), - AnalysisStage::Description => token.description.push(c) - } - - current_char = char_iter.next(); } + if token.short_name.is_empty() && token.long_name.is_empty() { + token.is_group = true; + } + Ok(token) } @@ -117,6 +116,16 @@ impl Token { "" } } + + pub fn fmt_with_padding(&self, padding: usize) -> String { + let mut name = format!("-{}, --{}", self.short_name, self.long_name); + + for _ in 0..padding { + name.push(' '); + } + + name + } } impl Display for Token { @@ -124,4 +133,4 @@ impl Display for Token { let repr = format!("-{}, --{} {}", self.short_name, self.long_name, self.description); write!(f, "{}", repr) } -} \ No newline at end of file +} diff --git a/src/lib.rs b/src/lib.rs index b8e551c..76908b8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,6 +24,7 @@ use std::env::Args; pub use errors::{Error, ErrorKind}; pub use matches::Matches; +pub use lexer::{analyze, collect, Token}; use opts::Opts; pub fn parse(mut args: Args, options: &[&'static str]) -> Result {