From d82cb7e5d1822c7cf01b14e463e7270dd33f1218 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 15 May 2020 08:47:32 -0400 Subject: [PATCH] netdoc: remove ArgError. --- tor-netdoc/src/argtype.rs | 54 ++++++++++++------------------------ tor-netdoc/src/routerdesc.rs | 13 ++++----- 2 files changed, 23 insertions(+), 44 deletions(-) diff --git a/tor-netdoc/src/argtype.rs b/tor-netdoc/src/argtype.rs index 5d80b162e..03bacfe0b 100644 --- a/tor-netdoc/src/argtype.rs +++ b/tor-netdoc/src/argtype.rs @@ -9,35 +9,17 @@ pub use b64impl::*; pub use curve25519impl::*; pub use timeimpl::*; -use thiserror::Error; - -/// A problem that can occur when parsing an argument. -#[derive(Error, Debug)] -#[non_exhaustive] -pub enum ArgError { - /// Invalid base64. - #[error("bad base64 encoding: {0}")] - Base64(#[from] base64::DecodeError), - /// A time that was in the wrong form, or out of range. - #[error("invalid time: {0}")] - BadTime(#[from] chrono::ParseError), - /// Some other error, represented as a string. - #[error("{0}")] - Generic(&'static str), -} - mod b64impl { - - use super::ArgError; + use crate::{Error, Pos, Result}; pub struct B64(Vec); impl std::str::FromStr for B64 { - type Err = ArgError; - fn from_str(s: &str) -> Result { - Ok(B64( - base64::decode_config(s, base64::STANDARD_NO_PAD).map_err(ArgError::Base64)? - )) + type Err = Error; + fn from_str(s: &str) -> Result { + let bytes = base64::decode_config(s, base64::STANDARD_NO_PAD) + .map_err(|e| Error::BadArgument(0, Pos::at(s), format!("Invalid base64: {}", e)))?; + Ok(B64(bytes)) } } @@ -57,20 +39,20 @@ mod b64impl { // ============================================================ mod curve25519impl { - use super::{ArgError, B64}; + use super::B64; + use crate::{Error, Pos, Result}; use std::convert::TryInto; use tor_llcrypto::pk::curve25519::PublicKey; pub struct Curve25519Public(PublicKey); impl std::str::FromStr for Curve25519Public { - type Err = ArgError; - fn from_str(s: &str) -> Result { + type Err = Error; + fn from_str(s: &str) -> Result { let b64: B64 = s.parse()?; - let arry: [u8; 32] = b64 - .as_bytes() - .try_into() - .map_err(|_| ArgError::Generic("wrong length"))?; + let arry: [u8; 32] = b64.as_bytes().try_into().map_err(|_| { + Error::BadArgument(0, Pos::at(s), "bad length for curve25519 key.".into()) + })?; Ok(Curve25519Public(arry.into())) } } @@ -85,17 +67,17 @@ mod curve25519impl { // ============================================================ mod timeimpl { - use super::ArgError; + use crate::{Error, Pos, Result}; use std::time::SystemTime; pub struct ISO8601TimeSp(SystemTime); impl std::str::FromStr for ISO8601TimeSp { - type Err = ArgError; - fn from_str(s: &str) -> Result { + type Err = Error; + fn from_str(s: &str) -> Result { use chrono::{DateTime, NaiveDateTime, Utc}; - let d = - NaiveDateTime::parse_from_str(s, "%Y-%m-%d %H:%M:%S").map_err(ArgError::BadTime)?; + let d = NaiveDateTime::parse_from_str(s, "%Y-%m-%d %H:%M:%S") + .map_err(|e| Error::BadArgument(0, Pos::at(s), format!("invalid time: {}", e)))?; let dt = DateTime::::from_utc(d, Utc); Ok(ISO8601TimeSp(dt.into())) } diff --git a/tor-netdoc/src/routerdesc.rs b/tor-netdoc/src/routerdesc.rs index b2a4844c2..7788d15c3 100644 --- a/tor-netdoc/src/routerdesc.rs +++ b/tor-netdoc/src/routerdesc.rs @@ -396,14 +396,11 @@ impl RouterDesc { let uptime = body.maybe(UPTIME).parse_arg(0)?; // published time. - let published = { - let p_item = body.get_required(PUBLISHED)?; - let p: ISO8601TimeSp = p_item - .args_as_str() - .parse() - .map_err(|e: ArgError| Error::BadArgument(1, p_item.pos(), e.to_string()))?; - p.into() - }; + let published = body + .get_required(PUBLISHED)? + .args_as_str() + .parse::()? + .into(); // ntor key // XXXX technically this isn't "required"