tor_cell/err.rs
1//! Define an error type for the tor-cell crate.
2use thiserror::Error;
3use tor_error::{ErrorKind, HasKind};
4
5/// An error type for the tor-cell crate.
6///
7/// This type should probably be split into several. There's more
8/// than one kind of error that can occur while doing something with
9/// tor cells.
10#[derive(Error, Debug, Clone)]
11#[non_exhaustive]
12pub enum Error {
13 /// An error that occurred in the tor_bytes crate while decoding an
14 /// object.
15 #[error("Error while parsing {parsed}")]
16 BytesErr {
17 /// The error that occurred.
18 #[source]
19 err: tor_bytes::Error,
20 /// The thing that was being parsed.
21 parsed: &'static str,
22 },
23 /// We encountered an error while encoding an outgoing message.
24 ///
25 /// This is likely to be a bug in somebody's code: either the code in this
26 /// crate, or in the calling code that provided an unencodable message.
27 #[error("Error while encoding message")]
28 EncodeErr(#[from] tor_bytes::EncodeError),
29 /// There was a programming error somewhere in the code.
30 #[error("Internal programming error")]
31 Internal(tor_error::Bug),
32 /// Protocol violation at the channel level
33 #[error("Channel protocol violation: {0}")]
34 ChanProto(String),
35 /// Protocol violation at the circuit level
36 #[error("Circuit protocol violation: {0}")]
37 CircProto(String),
38 /// Tried to make or use a stream to an invalid destination address.
39 #[error("Invalid stream target address")]
40 BadStreamAddress,
41 /// Tried to construct a message that Tor can't represent.
42 #[error("Message can't be represented in a Tor cell: {0}")]
43 CantEncode(&'static str),
44}
45
46impl HasKind for Error {
47 fn kind(&self) -> ErrorKind {
48 use Error as E;
49 use ErrorKind as EK;
50 match self {
51 E::EncodeErr(..) => EK::BadApiUsage,
52 E::BytesErr { .. } => EK::TorProtocolViolation,
53 E::Internal(_) => EK::Internal,
54 E::ChanProto(_) => EK::TorProtocolViolation,
55 E::CircProto(_) => EK::TorProtocolViolation,
56 E::BadStreamAddress => EK::BadApiUsage,
57 E::CantEncode(_) => EK::Internal,
58 }
59 }
60}