use kerberos_asn1::KrbError;
use kerberos_constants::error_codes;
use std::{fmt, io, result};
pub type Result<T> = result::Result<T, Error>;
#[derive(Debug)]
pub enum Error
{
String(String),
KrbError(KrbError),
IOError(String, io::Error),
DataError(String),
}
impl std::error::Error for Error {}
impl Error
{
pub fn is_not_found_error(&self) -> bool
{
if let Error::IOError(_, ref io_err) = self
{
return io_err.kind() == io::ErrorKind::NotFound;
}
false
}
pub fn is_data_error(&self) -> bool
{
if let Error::DataError(_) = self
{
return true;
}
false
}
}
impl fmt::Display for Error
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
match self
{
Error::String(s) => write!(f, "{}", s),
Error::DataError(s) => write!(f, "{}", s),
Error::KrbError(krb_error) =>
{
write!(f, "{}", create_krb_error_msg(krb_error))
},
Error::IOError(desc, io_error) =>
{
write!(f, "{}: {}", desc, io_error)
},
}
}
}
impl From<String> for Error
{
fn from(error: String) -> Self
{
Self::String(error)
}
}
impl From<&str> for Error
{
fn from(error: &str) -> Self
{
Self::String(error.to_string())
}
}
impl From<KrbError> for Error
{
fn from(error: KrbError) -> Self
{
Self::KrbError(error)
}
}
impl From<(&str, io::Error)> for Error
{
fn from(error: (&str, io::Error)) -> Self
{
Self::IOError(error.0.into(), error.1)
}
}
impl From<(String, io::Error)> for Error
{
fn from(error: (String, io::Error)) -> Self
{
Self::IOError(error.0, error.1)
}
}
fn create_krb_error_msg(krb_error: &KrbError) -> String
{
let error_string = error_codes::error_code_to_string(krb_error.error_code);
format!("Error {}: {}", krb_error.error_code, error_string)
}