xref: /webrtc/data/src/error.rs (revision 99037ca7)
1ffe74184SMartin Algesten use std::io;
2ffe74184SMartin Algesten use std::string::FromUtf8Error;
3ffe74184SMartin Algesten use thiserror::Error;
4ffe74184SMartin Algesten 
5ffe74184SMartin Algesten pub type Result<T> = std::result::Result<T, Error>;
6ffe74184SMartin Algesten 
7ffe74184SMartin Algesten #[derive(Debug, Error, PartialEq)]
8ffe74184SMartin Algesten #[non_exhaustive]
9ffe74184SMartin Algesten pub enum Error {
10ffe74184SMartin Algesten     #[error(
11ffe74184SMartin Algesten         "DataChannel message is not long enough to determine type: (expected: {expected}, actual: {actual})"
12ffe74184SMartin Algesten     )]
13ffe74184SMartin Algesten     UnexpectedEndOfBuffer { expected: usize, actual: usize },
14ffe74184SMartin Algesten     #[error("Unknown MessageType {0}")]
15ffe74184SMartin Algesten     InvalidMessageType(u8),
16ffe74184SMartin Algesten     #[error("Unknown ChannelType {0}")]
17ffe74184SMartin Algesten     InvalidChannelType(u8),
18ffe74184SMartin Algesten     #[error("Unknown PayloadProtocolIdentifier {0}")]
19ffe74184SMartin Algesten     InvalidPayloadProtocolIdentifier(u8),
20ffe74184SMartin Algesten     #[error("Stream closed")]
21ffe74184SMartin Algesten     ErrStreamClosed,
22ffe74184SMartin Algesten 
23ffe74184SMartin Algesten     #[error("{0}")]
24ffe74184SMartin Algesten     Util(#[from] util::Error),
25ffe74184SMartin Algesten     #[error("{0}")]
26ffe74184SMartin Algesten     Sctp(#[from] sctp::Error),
27ffe74184SMartin Algesten     #[error("utf-8 error: {0}")]
28ffe74184SMartin Algesten     Utf8(#[from] FromUtf8Error),
29ffe74184SMartin Algesten 
30ffe74184SMartin Algesten     #[allow(non_camel_case_types)]
31ffe74184SMartin Algesten     #[error("{0}")]
32ffe74184SMartin Algesten     new(String),
33ffe74184SMartin Algesten }
34ffe74184SMartin Algesten 
35ffe74184SMartin Algesten impl From<Error> for util::Error {
from(e: Error) -> Self36ffe74184SMartin Algesten     fn from(e: Error) -> Self {
37ffe74184SMartin Algesten         util::Error::from_std(e)
38ffe74184SMartin Algesten     }
39ffe74184SMartin Algesten }
40ffe74184SMartin Algesten 
41ffe74184SMartin Algesten impl From<Error> for io::Error {
from(error: Error) -> Self42ffe74184SMartin Algesten     fn from(error: Error) -> Self {
43ffe74184SMartin Algesten         match error {
44ffe74184SMartin Algesten             e @ Error::Sctp(sctp::Error::ErrEof) => {
45ffe74184SMartin Algesten                 io::Error::new(io::ErrorKind::UnexpectedEof, e.to_string())
46ffe74184SMartin Algesten             }
47ffe74184SMartin Algesten             e @ Error::ErrStreamClosed => {
48ffe74184SMartin Algesten                 io::Error::new(io::ErrorKind::ConnectionAborted, e.to_string())
49ffe74184SMartin Algesten             }
50ffe74184SMartin Algesten             e => io::Error::new(io::ErrorKind::Other, e.to_string()),
51ffe74184SMartin Algesten         }
52ffe74184SMartin Algesten     }
53ffe74184SMartin Algesten }
54ffe74184SMartin Algesten 
55ffe74184SMartin Algesten impl PartialEq<util::Error> for Error {
eq(&self, other: &util::Error) -> bool56ffe74184SMartin Algesten     fn eq(&self, other: &util::Error) -> bool {
57ffe74184SMartin Algesten         if let Some(down) = other.downcast_ref::<Error>() {
58ffe74184SMartin Algesten             return self == down;
59ffe74184SMartin Algesten         }
60ffe74184SMartin Algesten         false
61ffe74184SMartin Algesten     }
62ffe74184SMartin Algesten }
63*99037ca7SVincent Esche 
64*99037ca7SVincent Esche impl PartialEq<Error> for util::Error {
eq(&self, other: &Error) -> bool65*99037ca7SVincent Esche     fn eq(&self, other: &Error) -> bool {
66*99037ca7SVincent Esche         if let Some(down) = self.downcast_ref::<Error>() {
67*99037ca7SVincent Esche             return other == down;
68*99037ca7SVincent Esche         }
69*99037ca7SVincent Esche         false
70*99037ca7SVincent Esche     }
71*99037ca7SVincent Esche }
72