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