[go: up one dir, main page]

reis/
error.rs

1use crate::{event::EventError, handshake::HandshakeError, ParseError};
2use std::{fmt, io};
3
4#[derive(Debug)]
5pub enum Error {
6    UnexpectedHandshakeEvent,
7    InvalidInterfaceVersion(&'static str, u32),
8    // TODO better error type here?
9    Event(EventError),
10    Parse(ParseError),
11    Handshake(HandshakeError),
12    Io(io::Error),
13}
14
15impl fmt::Display for Error {
16    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17        match self {
18            Self::UnexpectedHandshakeEvent => write!(f, "unexpected handshake event"),
19            Self::InvalidInterfaceVersion(interface, version) => write!(
20                f,
21                "invalid version {} for interface '{}'",
22                version, interface
23            ),
24            Self::Event(err) => write!(f, "event error: {}", err),
25            Self::Io(err) => write!(f, "IO error: {}", err),
26            Self::Handshake(err) => write!(f, "handshake error: {}", err),
27            Self::Parse(err) => write!(f, "parse error: {}", err),
28        }
29    }
30}
31
32impl From<EventError> for Error {
33    fn from(err: EventError) -> Self {
34        Self::Event(err)
35    }
36}
37
38impl From<ParseError> for Error {
39    fn from(err: ParseError) -> Self {
40        Self::Parse(err)
41    }
42}
43
44impl From<HandshakeError> for Error {
45    fn from(err: HandshakeError) -> Self {
46        Self::Handshake(err)
47    }
48}
49
50impl From<io::Error> for Error {
51    fn from(err: io::Error) -> Self {
52        Self::Io(err)
53    }
54}
55
56impl std::error::Error for Error {}