summaryrefslogtreecommitdiff
path: root/src/entry.rs
diff options
context:
space:
mode:
authorBen Bridle <bridle.benjamin@gmail.com>2022-08-25 21:27:39 +1200
committerBen Bridle <bridle.benjamin@gmail.com>2022-08-25 21:27:39 +1200
commit8f410d1ead74b979481f1488a4dcddd33ea829c7 (patch)
tree2f22fd930c8d0cdb4de53fef473f7770073e14d5 /src/entry.rs
downloadvagabond-8f410d1ead74b979481f1488a4dcddd33ea829c7.zip
Initial commitv1.0
Diffstat (limited to 'src/entry.rs')
-rw-r--r--src/entry.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/entry.rs b/src/entry.rs
new file mode 100644
index 0000000..2679e42
--- /dev/null
+++ b/src/entry.rs
@@ -0,0 +1,86 @@
+use crate::EntryReadError;
+use std::path::{Path, PathBuf};
+
+#[derive(PartialEq)]
+pub enum EntryType {
+ File,
+ Directory,
+}
+
+pub struct Entry {
+ pub entry_type: EntryType,
+ pub is_symlink: bool,
+ pub name: String,
+ pub extension: String,
+ pub path: PathBuf,
+ pub original_path: PathBuf,
+}
+impl Entry {
+ pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Self, EntryReadError> {
+ let path = path.as_ref();
+ let metadata = path.metadata()?;
+ let canonical_path = std::fs::canonicalize(path)?;
+ let canonical_metadata = canonical_path.metadata()?;
+ let entry_type = if canonical_metadata.is_file() {
+ EntryType::File
+ } else if canonical_metadata.is_dir() {
+ EntryType::Directory
+ } else {
+ return Err(EntryReadError::NotFound);
+ };
+
+ let name = match path.file_name() {
+ Some(osstr) => osstr.to_string_lossy().to_string(),
+ None => unreachable!(),
+ };
+ let extension = match path.extension() {
+ Some(extension) => extension.to_string_lossy().into(),
+ None => String::default(),
+ };
+ Ok(Entry {
+ entry_type,
+ name,
+ extension,
+ path: canonical_path,
+ original_path: path.to_path_buf(),
+ is_symlink: metadata.is_symlink(),
+ })
+ }
+
+ /// Splits the filename on the last period, ignoring any period at the
+ /// start of the filename. If no extension is found, the extension is empty.
+ pub fn split_name(&self) -> (String, String) {
+ match self.name.rsplit_once(".") {
+ Some(("", _)) | None => (self.name.to_string(), String::new()),
+ Some((prefix, extension)) => (prefix.to_string(), extension.to_string()),
+ }
+ }
+
+ pub fn is_file(&self) -> bool {
+ match self.entry_type {
+ EntryType::File => true,
+ _ => false,
+ }
+ }
+
+ pub fn is_directory(&self) -> bool {
+ match self.entry_type {
+ EntryType::Directory => true,
+ _ => false,
+ }
+ }
+
+ pub fn read_as_bytes(&self) -> Result<Vec<u8>, EntryReadError> {
+ return Ok(std::fs::read(&self.path)?);
+ }
+
+ pub fn read_as_utf8_string(&self) -> Result<String, EntryReadError> {
+ return Ok(String::from_utf8_lossy(&self.read_as_bytes()?).to_string());
+ }
+}
+
+impl AsRef<Path> for Entry {
+ fn as_ref(&self) -> &Path {
+ &self.path
+ }
+}