mindustry logic execution, map- and schematic- parsing and rendering
Add an ArgOption reference for simpler access
KosmosPrime 2023-01-05
parent 64cdfbc · commit 8ccaee2
-rw-r--r--src/args.rs23
-rw-r--r--src/main.rs10
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(&reg);
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();