summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-11-04 18:48:18 -0500
committerToby Vincent <tobyv13@gmail.com>2022-11-04 18:48:18 -0500
commitc8681e50194855a2ad36bf984866a30cfcfb8ec9 (patch)
tree491608d44b0806d558dd5abf42bc53de9e9b7b0b /src
parentc81eb9a1a542cc058960cf4eab12fc70bc2a81eb (diff)
refactor: move run to main.rs and impl output from Finder
Diffstat (limited to 'src')
-rw-r--r--src/directories.rs4
-rw-r--r--src/finder.rs80
-rw-r--r--src/lib.rs18
-rw-r--r--src/main.rs21
4 files changed, 70 insertions, 53 deletions
diff --git a/src/directories.rs b/src/directories.rs
index df07c57..62a566f 100644
--- a/src/directories.rs
+++ b/src/directories.rs
@@ -14,14 +14,14 @@ pub struct Directories {
}
impl Directories {
- pub(crate) fn new(config: &Config) -> Directories {
+ pub fn new(config: &Config) -> Directories {
Directories {
config: config.to_owned(),
directories: config.add.to_owned(),
}
}
- pub(crate) fn walk(&mut self) -> Result<&mut Directories> {
+ pub fn walk(&mut self) -> Result<&mut Directories> {
let mut dirs = self.config.search.iter().cloned();
// Taking first element is neccissary due to requirement of an initial item
diff --git a/src/finder.rs b/src/finder.rs
index 688009c..db92c83 100644
--- a/src/finder.rs
+++ b/src/finder.rs
@@ -1,8 +1,9 @@
use std::{
io::Write,
- ops::Deref,
+ ops::{Deref, DerefMut},
+ os::unix::prelude::OsStrExt,
path::PathBuf,
- process::{Child, Command, Stdio},
+ process::{Child, Command, Output, Stdio},
};
pub use config::Config;
@@ -11,45 +12,62 @@ pub use error::{Error, Result};
mod config;
mod error;
-pub struct Finder {
- pub(crate) child: Child,
+pub struct Finder(Child);
+
+impl Finder {
+ pub fn new(config: &Config) -> Result<Self> {
+ Command::new(&config.program)
+ .args(&config.args)
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()
+ .map(Into::into)
+ .map_err(Into::into)
+ }
+
+ pub fn into_inner(self) -> Child {
+ self.0
+ }
+
+ pub fn write_path_buf_vectored<V>(&mut self, directories: V) -> Result<()>
+ where
+ V: IntoIterator<Item = PathBuf>,
+ {
+ let stdin = self.stdin.as_mut().ok_or(Error::Stdin)?;
+ directories.into_iter().try_for_each(|path_buf| {
+ stdin
+ .write_all(path_buf.into_os_string().as_bytes())
+ .map_err(From::from)
+ })
+ }
+
+ pub fn wait_with_output(self) -> Result<Output> {
+ self.into_inner().wait_with_output().map_err(From::from)
+ }
}
impl Deref for Finder {
type Target = Child;
fn deref(&self) -> &Self::Target {
- &self.child
+ &self.0
}
}
-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()?,
- })
+impl DerefMut for Finder {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.0
}
+}
- 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)
+impl From<Child> for Finder {
+ fn from(value: Child) -> Self {
+ Self(value)
+ }
+}
+
+impl From<Finder> for Child {
+ fn from(value: Finder) -> Child {
+ value.0
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 8f8b667..d5e43db 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,5 +1,3 @@
-use tracing::info;
-
pub use crate::cli::Cli;
pub use crate::config::Config;
pub use crate::directories::Directories;
@@ -11,19 +9,3 @@ mod config;
mod directories;
mod error;
mod finder;
-
-#[tracing::instrument()]
-pub fn run(config: &Config) -> Result<()> {
- let mut directories = Directories::new(&config.paths);
-
- directories.walk()?;
-
- let mut finder = Finder::new(&config.finder)?;
- finder.run(directories.directories)?;
-
- let output = finder.child.wait_with_output()?;
-
- info!("{:?}", output);
-
- Ok(())
-}
diff --git a/src/main.rs b/src/main.rs
index 9b4f400..5a6679e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,7 +5,8 @@ use figment::{
providers::{Env, Format, Serialized, Toml},
Figment,
};
-use tmuxr::{Cli, Config, Result};
+use tmuxr::{Cli, Config, Directories, Finder, Result};
+use tracing::info;
use tracing_subscriber::prelude::*;
fn main() -> Result<()> {
@@ -21,7 +22,7 @@ fn main() -> Result<()> {
eprintln!("Failed to initialize logging: {:?}", err)
}
- tmuxr::run(&config)
+ run(&config)
}
fn init_subscriber(cli: &Cli, config: &Config) -> Result<()> {
@@ -46,3 +47,19 @@ fn init_subscriber(cli: &Cli, config: &Config) -> Result<()> {
Ok(())
}
+
+#[tracing::instrument()]
+pub fn run(config: &Config) -> Result<()> {
+ let mut directories = Directories::new(&config.paths);
+ directories.walk()?;
+
+ let mut finder = Finder::new(&config.finder)?;
+
+ finder.write_path_buf_vectored(directories.directories)?;
+
+ let output = finder.wait_with_output()?;
+
+ info!("{:?}", output);
+
+ Ok(())
+}