From 3c3c95b54d12b1654c5c0810f7431190bc7d7580 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Mon, 28 Nov 2022 01:45:38 -0600 Subject: feat: add previewer trait --- src/project.rs | 38 ++++++++++++++++++++++++++++++++------ src/project/error.rs | 3 +++ src/project/git.rs | 20 ++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/project.rs b/src/project.rs index 5f1edc5..e6faf66 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,5 +1,7 @@ use std::{ + io::Write, path::PathBuf, + process::{Command, Stdio}, time::{Duration, SystemTime}, }; @@ -13,6 +15,20 @@ mod path; pub type ProjectItem = Box>; +pub trait Project: Timestamp { + fn to_path_buf(&self) -> &PathBuf; +} + +impl Project for T +where + T: Timestamp, + T: AsRef, +{ + fn to_path_buf(&self) -> &PathBuf { + self.as_ref() + } +} + pub trait Timestamp { type Error; @@ -34,16 +50,26 @@ where } } -pub trait Project: Timestamp { - fn to_path_buf(&self) -> &PathBuf; +pub trait Preview { + type Error; + + fn preview(&self) -> Result<(), Self::Error>; } -impl Project for T +impl Preview for T where - T: Timestamp, T: AsRef, { - fn to_path_buf(&self) -> &PathBuf { - self.as_ref() + type Error = std::io::Error; + + fn preview(&self) -> Result<(), Self::Error> { + let output = Command::new("ls") + .arg("-l") + .arg("-a") + .arg(self.to_path_buf()) + .stdout(Stdio::piped()) + .output()?; + + std::io::stdout().write_all(&output.stdout) } } diff --git a/src/project/error.rs b/src/project/error.rs index 7047533..ddfcb2a 100644 --- a/src/project/error.rs +++ b/src/project/error.rs @@ -8,4 +8,7 @@ pub enum Error { #[error(transparent)] SystemTime(#[from] std::time::SystemTimeError), + + #[error(transparent)] + Other(#[from] anyhow::Error), } diff --git a/src/project/git.rs b/src/project/git.rs index 17573c3..876af1c 100644 --- a/src/project/git.rs +++ b/src/project/git.rs @@ -1,8 +1,11 @@ use git2::{BranchType, Repository}; use ignore::DirEntry; +use onefetch::ui::printer::Printer; +use std::io; use std::{cmp::Ordering, path::PathBuf, time::Duration}; use crate::project::Error; +use crate::project::Preview; use crate::project::Timestamp; use crate::Project; @@ -57,6 +60,23 @@ impl Project for GitProject { } } +impl Preview for GitProject { + type Error = Error; + + fn preview(&self) -> Result<(), Self::Error> { + // onefetch --include-hidden --show-logo=auto + let config = onefetch::cli::Config { + input: self.path_buf.to_owned(), + ..Default::default() + }; + + let info = onefetch::info::Info::new(&config)?; + let mut printer = Printer::new(io::BufWriter::new(io::stdout()), info, config)?; + + printer.print().map_err(Into::into) + } +} + impl PartialEq for GitProject { fn eq(&self, other: &Self) -> bool { match (self.latest_commit, other.latest_commit) { -- cgit v1.2.3-70-g09d2