diff --git a/tor-netdoc/src/err.rs b/tor-netdoc/src/err.rs index cc4494f41..9f43b56f3 100644 --- a/tor-netdoc/src/err.rs +++ b/tor-netdoc/src/err.rs @@ -260,4 +260,28 @@ impl Error { } self } + + /// Return a new error based on this one, with the position (if + /// replaced by 'p' if it had no position before. + pub fn or_at_pos(mut self, p: Pos) -> Error { + if let Some(mypos) = self.pos_mut() { + if *mypos == Pos::None { + *mypos = p; + } + } + self + } } + +macro_rules! derive_from_err{ + { $etype:ty } => { + impl From<$etype> for Error { + fn from(e: $etype) -> Error { + Error::BadArgument(Pos::None, e.to_string()) + } + } + } +} + +derive_from_err! {std::num::ParseIntError} +derive_from_err! {std::net::AddrParseError} diff --git a/tor-netdoc/src/tokenize.rs b/tor-netdoc/src/tokenize.rs index 67ea0a0f3..6f495465f 100644 --- a/tor-netdoc/src/tokenize.rs +++ b/tor-netdoc/src/tokenize.rs @@ -279,13 +279,16 @@ impl<'a> Item<'a> { /// Returns Ok(None) if the argument doesn't exist. pub fn parse_optional_arg(&self, idx: usize) -> Result> where - ::Err: std::error::Error, + Error: From, { match self.get_arg(idx) { None => Ok(None), Some(s) => match s.parse() { Ok(r) => Ok(Some(r)), - Err(e) => Err(Error::BadArgument(Pos::at(s), e.to_string())), + Err(e) => { + let e: Error = e.into(); + Err(e.or_at_pos(Pos::at(s))) + } }, } } @@ -295,7 +298,7 @@ impl<'a> Item<'a> { /// Return an error if the argument doesn't exist. pub fn parse_arg(&self, idx: usize) -> Result where - ::Err: std::error::Error, + Error: From, { match self.parse_optional_arg(idx) { Ok(Some(v)) => Ok(v), @@ -389,7 +392,7 @@ impl<'a, 'b> MaybeItem<'a, 'b> { } pub fn parse_arg(&self, idx: usize) -> Result> where - ::Err: std::error::Error, + Error: From, { match self.0 { Some(item) => item.parse_arg(idx).map(Some), @@ -399,7 +402,7 @@ impl<'a, 'b> MaybeItem<'a, 'b> { #[allow(dead_code)] pub fn parse_optional_arg(&self, idx: usize) -> Result> where - ::Err: std::error::Error, + Error: From, { match self.0 { Some(item) => item.parse_optional_arg(idx), @@ -411,9 +414,9 @@ impl<'a, 'b> MaybeItem<'a, 'b> { self.0.map(|item| item.args_as_str()) } #[allow(dead_code)] - pub fn parse_args_as_str(&self) -> Result> + pub fn parse_args_as_str(&self) -> Result> where - V: FromStr, + Error: From, { match self.0 { Some(item) => Ok(Some(item.args_as_str().parse::()?)),