mod tokenizer_error;
pub use tokenizer_error::TokenizerError;
use std::{error::Error as StdError, fmt};
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum Error {
MissingHeader(String),
InvalidParam(String),
ParseError(String),
TokenizeError(String),
Utf8Error(String),
Unexpected(String),
}
impl Error {
pub fn tokenizer<'a, S, T>(tuple: (S, T)) -> Self
where
S: Into<String>,
T: Into<&'a bstr::BStr>,
{
Self::TokenizeError(format!(
"failed to tokenize {}: {}",
tuple.0.into(),
tuple.1.into()
))
}
pub fn missing_header(header: &'static str) -> Self {
Self::MissingHeader(header.into())
}
}
impl From<TokenizerError> for Error {
fn from(from: TokenizerError) -> Self {
Self::TokenizeError(from.context)
}
}
impl From<nom::Err<TokenizerError>> for Error {
fn from(from: nom::Err<TokenizerError>) -> Self {
match from {
nom::Err::Incomplete(_) => Self::Unexpected("incomplete parsing?".into()),
nom::Err::Error(e) => e.into(),
nom::Err::Failure(e) => e.into(),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::MissingHeader(inner) => write!(f, "rsip error: missing header: {}", inner),
Self::InvalidParam(inner) => write!(f, "rsip error: invalid header param: {}", inner),
Self::ParseError(inner) => write!(f, "rsip error: could not parse part: {}", inner),
Self::TokenizeError(inner) => write!(f, "Tokenizer error: {}", inner),
Self::Unexpected(inner) => write!(f, "rsip quite unexpected error: {}", inner),
Self::Utf8Error(inner) => write!(f, "rsip error: invalid utf8 ({})", inner),
}
}
}
impl StdError for Error {}
impl From<std::str::Utf8Error> for Error {
fn from(error: std::str::Utf8Error) -> Self {
Self::Utf8Error(error.to_string())
}
}
impl From<std::num::ParseIntError> for Error {
fn from(error: std::num::ParseIntError) -> Self {
Self::ParseError(error.to_string())
}
}