#![forbid(unsafe_code)] use crate::path::GenericPath; pub type Result = std::result::Result; #[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), PathLexicallyDirectory(GenericPath), PathLexicallyRelative(GenericPath), PathLexicallyInvalid(GenericPath), PathListHasEmptyComponents(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)), PathError::PathLexicallyDirectory(path) => f.write_fmt(format_args!( "The path {} ends in a slash, but is supposed to refer to a file, \ not a directory.", path)), PathError::PathLexicallyRelative(path) => f.write_fmt(format_args!( "The path {} is relative, not absolute.", path)), PathError::PathLexicallyInvalid(path) => f.write_fmt(format_args!( "This isn't a valid path. {}", path)), PathError::PathListHasEmptyComponents(path_list) => f.write_fmt(format_args!( "Path list has empty components: {}", path_list)), } } }