mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 12:23:32 +01:00
rust: Implement error types for Rust protover implementation.
This will allow us to do actual error handling intra-crate in a more rusty manner, e.g. propogating errors in match statements, conversion between error types, logging messages, etc. * FIXES part of #24031: https://bugs.torproject.org/24031.
This commit is contained in:
parent
3df9545492
commit
b6059297d7
43
src/rust/protover/errors.rs
Normal file
43
src/rust/protover/errors.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2018, The Tor Project, Inc.
|
||||||
|
// Copyright (c) 2018, isis agora lovecruft
|
||||||
|
// See LICENSE for licensing information
|
||||||
|
|
||||||
|
//! Various errors which may occur during protocol version parsing.
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
/// All errors which may occur during protover parsing routines.
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
|
||||||
|
#[allow(missing_docs)] // See Display impl for error descriptions
|
||||||
|
pub enum ProtoverError {
|
||||||
|
Overlap,
|
||||||
|
LowGreaterThanHigh,
|
||||||
|
Unparseable,
|
||||||
|
ExceedsMax,
|
||||||
|
ExceedsExpansionLimit,
|
||||||
|
UnknownProtocol,
|
||||||
|
ExceedsNameLimit,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Descriptive error messages for `ProtoverError` variants.
|
||||||
|
impl Display for ProtoverError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match *self {
|
||||||
|
ProtoverError::Overlap
|
||||||
|
=> write!(f, "Two or more (low, high) protover ranges would overlap once expanded."),
|
||||||
|
ProtoverError::LowGreaterThanHigh
|
||||||
|
=> write!(f, "The low in a (low, high) protover range was greater than high."),
|
||||||
|
ProtoverError::Unparseable
|
||||||
|
=> write!(f, "The protover string was unparseable."),
|
||||||
|
ProtoverError::ExceedsMax
|
||||||
|
=> write!(f, "The high in a (low, high) protover range exceeds u32::MAX."),
|
||||||
|
ProtoverError::ExceedsExpansionLimit
|
||||||
|
=> write!(f, "The protover string would exceed the maximum expansion limit."),
|
||||||
|
ProtoverError::UnknownProtocol
|
||||||
|
=> write!(f, "A protocol in the protover string we attempted to parse is unknown."),
|
||||||
|
ProtoverError::ExceedsNameLimit
|
||||||
|
=> write!(f, "An unrecognised protocol name was too long."),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,8 @@
|
|||||||
//! protocols to develop independently, without having to claim compatibility
|
//! protocols to develop independently, without having to claim compatibility
|
||||||
//! with specific versions of Tor.
|
//! with specific versions of Tor.
|
||||||
|
|
||||||
|
#[deny(missing_docs)]
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
extern crate smartlist;
|
extern crate smartlist;
|
||||||
extern crate external;
|
extern crate external;
|
||||||
@ -32,6 +34,7 @@ extern crate tor_util;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate tor_log;
|
extern crate tor_log;
|
||||||
|
|
||||||
|
pub mod errors;
|
||||||
mod protover;
|
mod protover;
|
||||||
pub mod ffi;
|
pub mod ffi;
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@ use std::u32;
|
|||||||
use tor_log::{LogSeverity, LogDomain};
|
use tor_log::{LogSeverity, LogDomain};
|
||||||
use external::c_tor_version_as_new_as;
|
use external::c_tor_version_as_new_as;
|
||||||
|
|
||||||
|
use errors::ProtoverError;
|
||||||
|
|
||||||
/// The first version of Tor that included "proto" entries in its descriptors.
|
/// The first version of Tor that included "proto" entries in its descriptors.
|
||||||
/// Authorities should use this to decide whether to guess proto lines.
|
/// Authorities should use this to decide whether to guess proto lines.
|
||||||
///
|
///
|
||||||
@ -54,7 +56,7 @@ impl fmt::Display for Proto {
|
|||||||
///
|
///
|
||||||
/// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES`
|
/// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES`
|
||||||
impl FromStr for Proto {
|
impl FromStr for Proto {
|
||||||
type Err = &'static str;
|
type Err = ProtoverError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
match s {
|
match s {
|
||||||
@ -68,7 +70,7 @@ impl FromStr for Proto {
|
|||||||
"LinkAuth" => Ok(Proto::LinkAuth),
|
"LinkAuth" => Ok(Proto::LinkAuth),
|
||||||
"Microdesc" => Ok(Proto::Microdesc),
|
"Microdesc" => Ok(Proto::Microdesc),
|
||||||
"Relay" => Ok(Proto::Relay),
|
"Relay" => Ok(Proto::Relay),
|
||||||
_ => Err("Not a valid protocol type"),
|
_ => Err(ProtoverError::UnknownProtocol),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user