aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-11-03 16:47:57 -0500
committerToby Vincent <tobyv13@gmail.com>2022-11-03 16:47:57 -0500
commitc81eb9a1a542cc058960cf4eab12fc70bc2a81eb (patch)
tree8deff281230dbdedea29299060e214f1bb685cf7 /src
parent53d0cefcb1ca3527935479cc07a6f5fe5b1f8051 (diff)
feat: impl finder
Diffstat (limited to 'src')
-rw-r--r--src/directories.rs13
-rw-r--r--src/directories/error.rs7
-rw-r--r--src/error.rs13
-rw-r--r--src/finder.rs48
-rw-r--r--src/finder/config.rs2
-rw-r--r--src/finder/error.rs11
-rw-r--r--src/lib.rs25
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,
+}
+
diff --git a/src/lib.rs b/src/lib.rs
index 9e49b46..8f8b667 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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);