summaryrefslogtreecommitdiff
path: root/src/errors/file_error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/errors/file_error.rs')
-rw-r--r--src/errors/file_error.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/errors/file_error.rs b/src/errors/file_error.rs
new file mode 100644
index 0000000..e601f94
--- /dev/null
+++ b/src/errors/file_error.rs
@@ -0,0 +1,41 @@
+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<String, FileError> {
+ 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,
+ } )
+ }
+}