pub use std::path::{Path, PathBuf}; pub enum FileError { InvalidExtension, NotFound, NotReadable, IsADirectory, InvalidUtf8, Unknown, } impl std::fmt::Debug for FileError { fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { let message = match self { Self::InvalidExtension => "File has invalid extension", Self::NotFound => "File was not found", Self::InvalidUtf8 => "File does not contain valid UTF-8 text", Self::NotReadable => "File is not readable", Self::IsADirectory => "File is a directory", Self::Unknown => "Unknown error while attempting to read from path", }; write!(f, "{message}") } } pub fn read_file(path: &Path) -> Result { match std::fs::read(&path) { Ok(bytes) => match String::from_utf8(bytes) { Ok(source) => Ok(source), Err(_) => return Err(FileError::InvalidUtf8), } Err(err) => return Err( match err.kind() { std::io::ErrorKind::NotFound => FileError::NotFound, std::io::ErrorKind::PermissionDenied => FileError::NotReadable, std::io::ErrorKind::IsADirectory => FileError::IsADirectory, _ => FileError::Unknown, } ) } }