diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/directories.rs | 4 | ||||
-rw-r--r-- | src/finder.rs | 80 | ||||
-rw-r--r-- | src/lib.rs | 18 | ||||
-rw-r--r-- | src/main.rs | 21 |
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 } } @@ -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(()) +} |