#[derive(Clone,Debug,Eq,Hash,Ord,PartialEq,PartialOrd)] pub enum FileNameError { ContainsSlash(String), } #[derive(Clone,Debug,Eq,Hash,Ord,PartialEq,PartialOrd)] pub enum DirectoryNameError { ContainsSlash(String), } #[derive(Clone,Debug,Eq,Hash,Ord,PartialEq,PartialOrd)] pub enum PathError { Parse(String), } impl std::error::Error for FileNameError { } impl std::error::Error for DirectoryNameError { } impl std::error::Error for PathError { } impl std::fmt::Display for FileNameError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { FileNameError::ContainsSlash(s) => f.write_fmt(format_args!( "File names cannot contain slashes, but {:?} does.", s)), } } } impl std::fmt::Display for DirectoryNameError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { DirectoryNameError::ContainsSlash(s) => f.write_fmt(format_args!( "File names cannot contain slashes, but {:?} does.", s)), } } } impl std::fmt::Display for PathError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { PathError::Parse(s) => f.write_fmt(format_args!("Syntax error in path: {}", s)), } } }