diff options
Diffstat (limited to 'src/trait_ext.rs')
-rw-r--r-- | src/trait_ext.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/trait_ext.rs b/src/trait_ext.rs index 350138b..51e352e 100644 --- a/src/trait_ext.rs +++ b/src/trait_ext.rs @@ -1,3 +1,17 @@ +use std::path::PathBuf; + +use crate::fail::{HResult, MimeError}; +use crate::files::File; + + + + + + + + + +// This makes using short-circuiting iterators more convenient pub trait ExtractResult<T> { fn extract(self) -> T; } @@ -10,3 +24,25 @@ impl<T> ExtractResult<T> for Result<T,T> { } } } + + +// To get MIME from Path without hassle +pub trait PathBufMime { + fn get_mime(&self) -> HResult<String>; +} + +impl PathBufMime for PathBuf { + fn get_mime(&self) -> HResult<String> { + let mut file = File::new_from_path(&self, None) + .map_err(|e| MimeError::AccessFailed(Box::new(e)))?; + file.meta_sync() + .map_err(|e| MimeError::AccessFailed(Box::new(e)))?;; + + + file.get_mime() + .map(|mime| { + Ok(format!("{}", mime)) + }) + .ok_or(MimeError::NoMimeFound)? + } +} |