mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/exe/args.rs')
-rw-r--r--src/exe/args.rs44
1 files changed, 38 insertions, 6 deletions
diff --git a/src/exe/args.rs b/src/exe/args.rs
index afd9e72..6e0742c 100644
--- a/src/exe/args.rs
+++ b/src/exe/args.rs
@@ -1,11 +1,12 @@
use std::borrow::Cow;
use std::collections::HashMap;
+use std::error;
use std::fmt;
use std::slice::from_ref;
pub trait ArgHandler
{
- type Error;
+ type Error: error::Error + 'static;
fn on_literal(&mut self, name: &str) -> Result<(), Self::Error>;
@@ -15,13 +16,13 @@ pub trait ArgHandler
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-pub enum Error<E>
+pub enum Error<E: error::Error + 'static>
{
Handler{pos: usize, val: E},
EmptyName{pos: usize},
}
-impl<E: fmt::Display> fmt::Display for Error<E>
+impl<E: error::Error + 'static> fmt::Display for Error<E>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
@@ -33,6 +34,18 @@ impl<E: fmt::Display> fmt::Display for Error<E>
}
}
+impl<E: error::Error + 'static> error::Error for Error<E>
+{
+ fn source(&self) -> Option<&(dyn error::Error + 'static)>
+ {
+ match self
+ {
+ Error::Handler{pos: _, val} => Some(val),
+ _ => None,
+ }
+ }
+}
+
pub fn parse<I: Iterator, H: ArgHandler>(args: &mut I, handler: &mut H, arg_off: usize) -> Result<bool, Error<H::Error>>
where I::Item: AsRef<str>
{
@@ -269,13 +282,13 @@ 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<OptionRef, (ArgOption, &ArgOption)>
+ pub fn add(&mut self, opt: ArgOption) -> Result<OptionRef, AddArgError>
{
match opt.short
{
Some(c) => match self.short_map.get(&c)
{
- Some(&i) => return Err((opt, &self.options[i].0)),
+ Some(&i) => return Err(AddArgError{to_add: opt, existing: &self.options[i].0}),
_ => (),
},
_ => (),
@@ -284,7 +297,7 @@ impl OptionHandler
{
Some(ref s) => match self.long_map.get(&**s)
{
- Some(&i) => return Err((opt, &self.options[i].0)),
+ Some(&i) => return Err(AddArgError{to_add: opt, existing: &self.options[i].0}),
_ => (),
},
_ => (),
@@ -423,6 +436,23 @@ impl OptionHandler
#[derive(Clone, Copy, Debug)]
pub struct OptionRef(usize);
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct AddArgError<'l>
+{
+ pub to_add: ArgOption,
+ pub existing: &'l ArgOption,
+}
+
+impl<'l> fmt::Display for AddArgError<'l>
+{
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
+ {
+ write!(f, "Duplicate argument {} (already have {})", self.to_add, self.existing)
+ }
+}
+
+impl<'l> error::Error for AddArgError<'l> {}
+
impl ArgHandler for OptionHandler
{
type Error = OptionError;
@@ -480,3 +510,5 @@ impl fmt::Display for OptionError
}
}
}
+
+impl error::Error for OptionError {}