diff --git a/Cargo.lock b/Cargo.lock index b55bef4..4de4664 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -176,6 +176,7 @@ dependencies = [ "env_logger", "log", "mime_guess", + "once_cell", "rayon", "smartstring", "snailquote", diff --git a/Cargo.toml b/Cargo.toml index 06efe0f..1873a5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ xdg-mime = {git = "https://github.com/ebassi/xdg-mime-rs", version = "0.3", rev mime_guess = "2.0.3" rayon = "1.5.0" snailquote = "0.3.0" +once_cell = "1.5.2" [dependencies.clap] version = "3.0.0-beta.2" diff --git a/src/findings.rs b/src/findings.rs new file mode 100644 index 0000000..2fb2a11 --- /dev/null +++ b/src/findings.rs @@ -0,0 +1,17 @@ +use std::path::PathBuf; +use crate::inspectors::mime_extension_lookup; +use mime_guess::Mime; +use smartstring::alias::String; + +pub struct Findings { + pub file: PathBuf, // TODO: replace with Path???? <'a> and all that + pub valid: bool, + pub mime: Mime, +} + +impl Findings { + pub fn recommended_extension(&self) -> Option { + mime_extension_lookup(self.mime.clone()) + .map(|extensions| extensions[0].to_owned()) + } +} diff --git a/src/formats.rs b/src/formats.rs index cd4ed39..a5744d3 100644 --- a/src/formats.rs +++ b/src/formats.rs @@ -16,13 +16,13 @@ type Entries = [Result]; fn write_pathbuf(f: &mut W, path: &PathBuf) -> io::Result<()> { match path.to_str() { - Some(string) => {write!(f, "{}", escape(string))} + Some(string) => { write!(f, "{}", escape(string)) } None => { write!(f, "'")?; #[cfg(unix)] - f.write_all(&*path.as_os_str().as_bytes())?; + f.write_all(&*path.as_os_str().as_bytes())?; #[cfg(windows)] - f.write_all(&*path.as_os_str().encode_wide().collect())?; // TODO: TEST THIS + f.write_all(&*path.as_os_str().encode_wide().collect())?; // TODO: TEST THIS write!(f, "'") } } @@ -51,9 +51,8 @@ pub trait Format { self.rename( f, &finding.file, - &finding.file.with_extension(ext.as_str()) + &finding.file.with_extension(ext.as_str()), )? - } else { self.no_known_extension(f, &finding.file)? } @@ -76,6 +75,7 @@ pub trait Format { } pub struct Script {} + impl Format for Script { fn new() -> Self { Self {} } diff --git a/src/inspectors.rs b/src/inspectors.rs index dc4916d..069993d 100644 --- a/src/inspectors.rs +++ b/src/inspectors.rs @@ -28,7 +28,7 @@ pub fn mime_type(db: &SharedMimeInfo, path: &Path) -> io::Result, > // this lint can be ignored: it's okay if the file isn't long enough to fill the buffer, as we only care about the // first few bytes for the purpose of mime sniffing #[allow(clippy::unused_io_amount)] - file.read(&mut buffer)?; + file.read(&mut buffer)?; let r = db.get_mime_type_for_data(&buffer).map(|m| m.0); diff --git a/src/main.rs b/src/main.rs index 9ea7747..5d19eeb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,6 @@ use std::path::{Path, PathBuf}; use clap::Clap; use log::{debug, info, trace, warn}; -use mime_guess::Mime; use rayon::prelude::*; use smartstring::alias::String; use walkdir::{DirEntry, WalkDir}; @@ -29,35 +28,13 @@ use xdg_mime::SharedMimeInfo; use crate::formats::{Format, Script}; use crate::parameters::OutputFormat; use crate::scanerror::ScanError; +use crate::findings::Findings; mod parameters; mod inspectors; mod formats; mod scanerror; - -pub struct Findings { - file: PathBuf, // TODO: replace with Path???? <'a> and all that - valid: bool, - mime: Mime, -} - -impl Findings { - fn recommended_extension(&self) -> Option { - inspectors::mime_extension_lookup(self.mime.clone()) - .map(|extensions| extensions[0].to_owned()) - } -} - -impl Display for ScanError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", - match self { - Self::File => "Couldn't read file", - Self::Mime => "Couldn't determine mime type" - } - ) - } -} +mod findings; // TODO: test if this actually works on a windows machine - not there's much of a point right now, considering // xdg-mime-rs doesn't support windows @@ -67,7 +44,7 @@ fn is_hidden(entry: &DirEntry) -> bool { std::fs::metadata(entry) // try to get metadata for file .map_or( false, // if getting metadata/attributes fails, assume it's not hidden - |f| f.file_attributes() & 0x2 > 0 // flag for hidden - https://docs.microsoft.com/windows/win32/fileio/file-attribute-constants + |f| f.file_attributes() & 0x2 > 0, // flag for hidden - https://docs.microsoft.com/windows/win32/fileio/file-attribute-constants ) } @@ -89,11 +66,11 @@ fn wanted_file(args: ¶meters::Parameters, entry: &DirEntry) -> bool { let ext = extension_from_path(entry.path()); - if ext.is_none() { return false } // don't scan files without extensions. TODO - this should be configurable + if ext.is_none() { return false; } // don't scan files without extensions. TODO - this should be configurable if let Some(extensions) = &args.extensions { // if the user has specified a list of extensions to check against, make sure this file ends in one of them. - return extensions.contains(&ext.unwrap().to_lowercase().into()) + return extensions.contains(&ext.unwrap().to_lowercase().into()); } true } @@ -161,7 +138,7 @@ fn scan_from_walkdir(db: &SharedMimeInfo, entries: Vec) -> Vec { + OutputFormat::Script => { let s = Script::new(); s.write_all(&results, &mut BufWriter::new(stdout().lock())).expect("failed to output"); - }, + } OutputFormat::Text => debug!("eewr") } diff --git a/src/parameters.rs b/src/parameters.rs index 94c5424..bd398c5 100644 --- a/src/parameters.rs +++ b/src/parameters.rs @@ -6,7 +6,7 @@ use smartstring::{LazyCompact, SmartString}; #[derive(Clap, PartialEq, Debug)] pub enum OutputFormat { Script, - Text + Text, } #[derive(Clap, Debug)] @@ -20,7 +20,7 @@ pub struct Parameters { pub scan_hidden: bool, /// Output format to use. See "--help formats" for more information. - #[clap(short, long, default_value="script", arg_enum)] + #[clap(short, long, default_value = "script", arg_enum)] pub output_format: OutputFormat, /// Directory to process diff --git a/src/scanerror.rs b/src/scanerror.rs index 34af30b..ff11ec4 100644 --- a/src/scanerror.rs +++ b/src/scanerror.rs @@ -1,4 +1,17 @@ +use std::fmt::{Display, Formatter, Result}; + pub enum ScanError { File, Mime +} + +impl Display for ScanError { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + write!(f, "{}", + match self { + Self::File => "Couldn't read file", + Self::Mime => "Couldn't determine mime type" + } + ) + } } \ No newline at end of file