diff --git a/cli/src/arguments.rs b/cli/src/arguments.rs index 48eb76b..5175d19 100644 --- a/cli/src/arguments.rs +++ b/cli/src/arguments.rs @@ -13,6 +13,8 @@ pub(crate) struct Arguments { pub(crate) enum Commands { #[command(about = "print the current webring sites and their names")] Print { + #[arg(help = "url you want to filter to")] + filter: Option, #[command(flatten)] group: PrintGroup, #[arg( diff --git a/cli/src/commands.rs b/cli/src/commands.rs index d2f7177..ecfac66 100644 --- a/cli/src/commands.rs +++ b/cli/src/commands.rs @@ -6,7 +6,7 @@ use shared::{errors::Error, names::Site}; use crate::arguments::PrintGroup; -fn group_printing(seperator: &Option, site: Site, group: &PrintGroup) { +fn group_printing(seperator: &Option, site: &Site, group: &PrintGroup) { let mut string = String::new(); let delimiter = seperator.unwrap_or(','); @@ -16,37 +16,67 @@ fn group_printing(seperator: &Option, site: Site, group: &PrintGroup) { if group.name { if !string.is_empty() { - string += &format!("{}{}", delimiter, site.name.unwrap_or("None".to_string())) + string += &format!( + "{}{}", + delimiter, + site.name.as_ref().unwrap_or(&"None".into()) + ) } else { - string += &site.name.unwrap_or("None".to_string()); + string += &site.name.as_ref().unwrap_or(&"None".into()); } } log::info!("{}", string); } -fn json_printing(site: Site) -> Result<(), Error> { +fn json_printing(site: &Site) -> Result<(), Error> { match serde_json::to_string(&site) { Ok(json) => { log::info!("{}", json); Ok(()) } - Err(err) => Err(Error { status: ErrorStatus::ParsingError, data: err.to_string() }), + Err(err) => Err(Error { + status: ErrorStatus::ParsingError, + data: err.to_string(), + }), } } +fn filter_site(site: &Site, json: bool, seperator: &Option, group: &PrintGroup) -> Result<(), Error> { + if json { + json_printing(site)?; + return Ok(()); + } + + if !group.url && !group.name { + log::info!("{:?}", site); + return Ok(()); + } + + return Ok(group_printing(seperator, site, group)); +} + pub(crate) fn print( path: &Path, + filter: &Option, group: &PrintGroup, seperator: &Option, json: bool, ) -> Result<(), Error> { let names_file = names::read_names_file(path)?; - let names = names::load_names(names_file)?; + let mut names = names::load_names(names_file)?; + + if let Some(filter) = filter { + names.retain(|f| &f.url == filter); + if names.len() == 0 { + return Err(Error { status: ErrorStatus::NotFoundError, data: "this url was not found in names.json".into() }) + } + return filter_site(&names[0], json, seperator, group); + } for site in names { if json { - json_printing(site)?; + json_printing(&site)?; continue; } @@ -55,7 +85,7 @@ pub(crate) fn print( continue; } - group_printing(seperator, site, group); + group_printing(seperator, &site, group); } Ok(()) diff --git a/cli/src/main.rs b/cli/src/main.rs index 3cdc11f..84d4e48 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -20,7 +20,7 @@ fn main() -> Result<(), Error> { }; match &args.command { - Commands::Print { group, seperator, json } => print(path, group, seperator, *json)?, + Commands::Print { filter, group, seperator, json, } => print(path, filter, group, seperator, *json)?, Commands::Add { url, name } => add(path, url, name)?, Commands::Remove { url } => remove(path, url)?, }; diff --git a/shared/src/errors.rs b/shared/src/errors.rs index 22d62ef..dcb9eae 100644 --- a/shared/src/errors.rs +++ b/shared/src/errors.rs @@ -3,7 +3,8 @@ pub enum ErrorStatus { IOError, ParsingError, DirectoriesError, - LoggerInitializationError + LoggerInitializationError, + NotFoundError } pub struct Error {