Something went wrong. Try again.
A Rust clone of doing by Brett Terpstra — a command line tool for remembering what you were doing and tracking what you've done. doing.aaronmallen.dev
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126use clap::Args;use doing_plugins as plugins;
use crate::Result;
/// List all registered export and import plugins.////// Displays each plugin's name and trigger pattern, grouped by type/// (Export / Import). Trigger patterns show what `--output` or `--type`/// values each plugin responds to.////// # Examples////// ```text/// doing plugins # list all registered plugins/// ```#[derive(Args, Clone, Debug)]pub struct Command { /// Display plugins in column format #[arg(short, long)] column: bool,
/// Filter plugins by type (import/export) #[arg(short = 't', long = "type")] plugin_type: Option<String>,}
impl Command { pub fn call(&self) -> Result<()> { if let Some(ref t) = self.plugin_type && !t.eq_ignore_ascii_case("export") && !t.eq_ignore_ascii_case("import") { return Err(crate::Error::Config(format!( "invalid plugin type '{t}'. Valid types: import, export" ))); }
let show_export = self .plugin_type .as_ref() .map(|t| t.eq_ignore_ascii_case("export")) .unwrap_or(true); let show_import = self .plugin_type .as_ref() .map(|t| t.eq_ignore_ascii_case("import")) .unwrap_or(true);
if show_export { if !self.column { println!("Export Plugins:"); } let export_registry = plugins::default_registry()?; for name in export_registry.available_formats() { if let Some(plugin) = export_registry.resolve(name) { if self.column { println!("{name}"); } else { let trigger = plugin.settings().trigger; println!(" {name} ({trigger})"); } } } }
if show_export && show_import && !self.column { println!(); }
if show_import { if !self.column { println!("Import Plugins:"); } let import_registry = plugins::import::default_registry()?; for name in import_registry.available_formats() { if let Some(plugin) = import_registry.resolve(name) { if self.column { println!("{name}"); } else { let trigger = plugin.settings().trigger; println!(" {name} ({trigger})"); } } } }
Ok(()) }}
#[cfg(test)]mod test { use super::*;
mod call { use super::*;
#[test] fn it_does_not_error() { let cmd = Command { column: false, plugin_type: None, };
let result = cmd.call();
assert!(result.is_ok()); }
#[test] fn it_errors_on_invalid_type() { let cmd = Command { column: false, plugin_type: Some("foo".into()), };
let result = cmd.call();
assert!(result.is_err()); let err = result.unwrap_err().to_string(); assert!(err.contains("invalid plugin type"), "unexpected error: {err}"); } }}