You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
1.8 KiB

//! Config parsing error
use super::*;
use std::{
io,
path::PathBuf,
};
#[derive(Debug)]
pub enum Error {
IO(io::Error),
Syntax(sexp::Error),
NotFound(PathBuf),
InvalidUtf8,
TypeError{expected:LispType, got: LispType},
BadLength,
Unknown,
}
impl Error
{
/// Helper function for type errors
#[inline]
pub fn bad_type<T,U>(expected: T, got: U) -> Self
where T: Into<LispType>,
U: Into<LispType>
{
Self::TypeError {
expected: expected.into(),
got: got.into()
}
}
}
impl std::error::Error for Error
{
fn source(&self) -> Option<&(dyn std::error::Error + 'static)>
{
Some(match &self {
Self::IO(io) => io,
Self::Syntax(sy) => sy,
_ => return None,
})
}
}
impl std::fmt::Display for Error
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
match self {
Self::IO(io) => write!(f, "i/o error: {}", io),
Self::Syntax(sy) => write!(f, "s-expression syntax error: {}", sy),
Self::NotFound(path) => write!(f, "File not found: {:?}", path),
Self::InvalidUtf8 => write!(f, "Invalid UTF8 decoded string or some such"),
Self::TypeError{expected, got} => write!(f, "Type mismatch: Expected {}, got {}", expected, got),
Self::BadLength => write!(f, "expected at least 1 element"),
_ => write!(f, "unknown error")
}
}
}
impl From<io::Error> for Error
{
fn from(from: io::Error) -> Self
{
Self::IO(from)
}
}
impl From<sexp::Error> for Error
{
fn from(from: sexp::Error) -> Self
{
Self::Syntax(from)
}
}
impl From<Box<sexp::Error>> for Error
{
fn from(from: Box<sexp::Error>) -> Self
{
Self::Syntax(*from)
}
}
impl From<std::str::Utf8Error> for Error
{
fn from(_: std::str::Utf8Error) -> Self
{
Self::InvalidUtf8
}
}