diff options
-rw-r--r-- | src/directories.rs | 13 | ||||
-rw-r--r-- | src/directories/error.rs | 7 | ||||
-rw-r--r-- | src/error.rs | 13 | ||||
-rw-r--r-- | src/finder.rs | 48 | ||||
-rw-r--r-- | src/finder/config.rs | 2 | ||||
-rw-r--r-- | src/finder/error.rs | 11 | ||||
-rw-r--r-- | src/lib.rs | 25 |
7 files changed, 66 insertions, 53 deletions
diff --git a/src/directories.rs b/src/directories.rs index ad3f3dc..df07c57 100644 --- a/src/directories.rs +++ b/src/directories.rs @@ -9,15 +9,15 @@ mod error; #[derive(Debug, PartialEq, Eq, Default)] pub struct Directories { - directories: Vec<PathBuf>, config: Config, + pub directories: Vec<PathBuf>, } impl Directories { pub(crate) fn new(config: &Config) -> Directories { Directories { - directories: config.add.to_owned(), config: config.to_owned(), + directories: config.add.to_owned(), } } @@ -41,15 +41,6 @@ impl Directories { self.directories.extend(results?); Ok(self) } - - pub fn as_stdin(&self) -> String { - self.directories - .iter() - .cloned() - .map(|p: PathBuf| p.to_string_lossy().into()) - .collect::<Vec<String>>() - .join("\n") - } } impl Deref for Directories { diff --git a/src/directories/error.rs b/src/directories/error.rs index 4e77fc1..8509b08 100644 --- a/src/directories/error.rs +++ b/src/directories/error.rs @@ -5,13 +5,6 @@ pub enum Error { #[error("Ignore error: {0:?}")] Ignore(#[from] ignore::Error), - #[error("Path error: {0:?}")] - Path(#[from] PathError), -} - -#[derive(thiserror::Error, Debug)] -pub enum PathError { #[error("Path contains invalid unicode: {0:?}")] Unicode(String), } - diff --git a/src/error.rs b/src/error.rs index 3b45fe4..fe94978 100644 --- a/src/error.rs +++ b/src/error.rs @@ -11,15 +11,6 @@ pub enum Error { #[error("Directories error: {0:?}")] Directories(#[from] crate::directories::Error), - #[error("Process error: {0:?}")] - Finder(String), - - #[error("Path error: {0:?}")] - Path(#[from] PathError), -} - -#[derive(thiserror::Error, Debug)] -pub enum PathError { - #[error("Path contains invalid unicode: {0:?}")] - Unicode(String), + #[error("Finder error: {0:?}")] + Finder(#[from] crate::finder::Error), } diff --git a/src/finder.rs b/src/finder.rs index da88beb..688009c 100644 --- a/src/finder.rs +++ b/src/finder.rs @@ -1,15 +1,55 @@ -use std::ops::Deref; +use std::{ + io::Write, + ops::Deref, + path::PathBuf, + process::{Child, Command, Stdio}, +}; pub use config::Config; +pub use error::{Error, Result}; mod config; +mod error; -pub struct Finder(Config); +pub struct Finder { + pub(crate) child: Child, +} impl Deref for Finder { - type Target = Config; + type Target = Child; fn deref(&self) -> &Self::Target { - &self.0 + &self.child + } +} + +impl Finder { + pub(crate) fn new(config: &Config) -> Result<Self> { + Ok(Finder { + child: Command::new(&config.program) + .args(&config.args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn()?, + }) + } + + pub(crate) fn run<V>(&mut self, directories: V) -> Result<()> + where + V: IntoIterator<Item = PathBuf>, + { + let stdin = directories + .into_iter() + .map(|p: PathBuf| p.to_string_lossy().into()) + .collect::<Vec<String>>() + .join("\n"); + + self.child + .stdin + .as_mut() + .ok_or(Error::Stdin)? + .deref() + .write_all(stdin.as_bytes()) + .map_err(Into::into) } } diff --git a/src/finder/config.rs b/src/finder/config.rs index cb24b5c..bc39556 100644 --- a/src/finder/config.rs +++ b/src/finder/config.rs @@ -1,7 +1,7 @@ use figment::{providers::Serialized, value, Figment, Metadata, Profile, Provider}; use serde::{Deserialize, Serialize}; -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] pub struct Config { pub program: String, pub args: Vec<String>, diff --git a/src/finder/error.rs b/src/finder/error.rs new file mode 100644 index 0000000..46d39c4 --- /dev/null +++ b/src/finder/error.rs @@ -0,0 +1,11 @@ +pub type Result<T> = std::result::Result<T, Error>; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("IO error: {0:?}")] + IO(#[from] std::io::Error), + + #[error("Stdin error: Failed to get finder's stdin")] + Stdin, +} + @@ -1,20 +1,16 @@ -use std::{ - io::Write, - process::{Command, Stdio}, -}; use tracing::info; pub use crate::cli::Cli; pub use crate::config::Config; -pub use crate::error::{Error, PathError, Result}; -pub use crate::finder::Finder; pub use crate::directories::Directories; +pub use crate::error::{Error, Result}; +pub use crate::finder::Finder; mod cli; mod config; +mod directories; mod error; mod finder; -mod directories; #[tracing::instrument()] pub fn run(config: &Config) -> Result<()> { @@ -22,19 +18,10 @@ pub fn run(config: &Config) -> Result<()> { directories.walk()?; - let mut finder = Command::new(&config.finder.program) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .args(&config.finder.args) - .spawn()?; - - finder - .stdin - .as_mut() - .ok_or_else(|| Error::Finder("Failed to get finder's stdin".to_string()))? - .write_all(directories.as_stdin().as_bytes())?; + let mut finder = Finder::new(&config.finder)?; + finder.run(directories.directories)?; - let output = finder.wait_with_output()?; + let output = finder.child.wait_with_output()?; info!("{:?}", output); |