use crate::path::GenericPath; type ParseError<'a> = lalrpop_util::ParseError, &'a str>; #[derive(Debug)] pub enum Error { IO(std::io::Error), Parse(String), PathListHasEmptyComponents(String), PathIsAFile(GenericPath), PathIsRelative(GenericPath), PathInvalid(GenericPath), } impl std::error::Error for Error { } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Error::IO(e) => e.fmt(f), Error::Parse(e) => e.fmt(f), Error::PathListHasEmptyComponents(path_list) => f.write_fmt(format_args!( "Path list has empty components: {}", path_list)), Error::PathIsAFile(path) => f.write_fmt(format_args!( "There's a file at {}, not a directory.", path)), Error::PathIsRelative(path) => f.write_fmt(format_args!( "The path {} is relative, not absolute.", path)), Error::PathInvalid(path) => f.write_fmt(format_args!( "This isn't a valid path. {}", path)), } } } impl From for Error { fn from(e: std::io::Error) -> Error { Error::IO(e) } } impl From> for Error { fn from(e: ParseError<'_>) -> Error { Error::Parse(format!("{}", e)) } }