mindustry logic execution, map- and schematic- parsing and rendering
Add an ArgOption reference for simpler access
| -rw-r--r-- | src/args.rs | 23 | ||||
| -rw-r--r-- | src/main.rs | 10 |
2 files changed, 25 insertions, 8 deletions
diff --git a/src/args.rs b/src/args.rs index 62a2596..eea8b80 100644 --- a/src/args.rs +++ b/src/args.rs @@ -177,7 +177,7 @@ impl OptionHandler Self{options: Vec::new(), short_map: HashMap::new(), long_map: HashMap::new(), literals: Vec::new()} } - pub fn add(&mut self, opt: ArgOption) -> Result<(), (ArgOption, &ArgOption)> + pub fn add(&mut self, opt: ArgOption) -> Result<OptionRef, (ArgOption, &ArgOption)> { match opt.short { @@ -210,7 +210,7 @@ impl OptionHandler let k = &**s; self.long_map.insert(k.to_owned(), idx); } - Ok(()) + Ok(OptionRef(idx)) } pub fn options(&self) -> &Vec<(ArgOption, OptionValue)> @@ -218,6 +218,22 @@ impl OptionHandler &self.options } + pub fn get(&self, opt_ref: OptionRef) -> (&ArgOption, &OptionValue) + { + let opt = &self.options[opt_ref.0]; + (&opt.0, &opt.1) + } + + pub fn get_option(&self, opt_ref: OptionRef) -> &ArgOption + { + &self.options[opt_ref.0].0 + } + + pub fn get_value(&self, opt_ref: OptionRef) -> &OptionValue + { + &self.options[opt_ref.0].1 + } + pub fn get_short(&self, name: char) -> Option<&(ArgOption, OptionValue)> { self.short_map.get(&name).map(|&i| &self.options[i]) @@ -254,6 +270,9 @@ impl OptionHandler } } +#[derive(Clone, Copy, Debug)] +pub struct OptionRef(usize); + impl ArgHandler for OptionHandler { type Error = OptionError; diff --git a/src/main.rs b/src/main.rs index d141581..871ecbb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,11 +27,9 @@ fn main() fn main_print(mut args: Args) { - const FILE: ArgOption = ArgOption::new(Some('f'), Some(Cow::Borrowed("file"))); - const INTERACTIVE: ArgOption = ArgOption::new(Some('i'), Some(Cow::Borrowed("interactive"))); let mut handler = OptionHandler::new(); - handler.add(FILE).unwrap(); - handler.add(INTERACTIVE).unwrap(); + let opt_file = handler.add(ArgOption::new(Some('f'), Some(Cow::Borrowed("file")))).unwrap(); + let opt_interact = handler.add(ArgOption::new(Some('i'), Some(Cow::Borrowed("interactive")))).unwrap(); match args::parse(&mut args, &mut handler) { Err(args::Error::Handler{pos, val: OptionError::NoSuchShort(short)}) => @@ -67,7 +65,7 @@ fn main_print(mut args: Args) let mut ss = SchematicSerializer(®); let mut first = true; // process the file if any - let file = match handler.get_long("file").unwrap().1.get_value() + let file = match handler.get_value(opt_file).get_value() { None => false, Some(ref path) => @@ -112,7 +110,7 @@ fn main_print(mut args: Args) } } // if --interactive or no schematics: continue parsing from console - if handler.get_long("interactive").unwrap().1.is_present() || (!file && handler.get_literals().is_empty()) + if handler.get_value(opt_interact).is_present() || (!file && handler.get_literals().is_empty()) { println!("\nEntering interactive mode, paste schematic to print details.\n"); let mut buff = String::new(); |