meowy-webring/crates/cli/src/commands/print.rs

89 lines
1.7 KiB
Rust

use crate::{arguments::PrintGroup, commands::utils::site_string};
use shared::{
errors::{Error, ErrorStatus},
names::{self, Site},
};
use std::path::Path;
use super::utils::PrintOptions;
pub(crate) fn print(
path: &Path,
filter: &Option<String>,
group: &PrintGroup,
separator: &String,
json: bool,
) -> Result<(), Error> {
let names_file = names::read_names_file(path)?;
let mut names = names::load_names(names_file)?;
if let Some(filter) = filter {
names.retain(|f| &f.url == filter);
if names.is_empty() {
return Err(Error {
status: ErrorStatus::NotFoundError,
data: "this url was not found in names.json".into(),
});
}
return filter_site(&names[0], json, separator, group);
}
for site in names {
if json {
json_printing(&site)?;
continue;
}
printing(separator, &site, group);
}
Ok(())
}
fn filter_site(
site: &Site,
json: bool,
separator: &String,
group: &PrintGroup,
) -> Result<(), Error> {
if json {
json_printing(site)?;
return Ok(());
}
printing(separator, site, group);
Ok(())
}
fn json_printing(site: &Site) -> Result<(), Error> {
match serde_json::to_string(&site) {
Ok(json) => {
println!("{}", json);
Ok(())
}
Err(err) => Err(Error {
status: ErrorStatus::ParsingError,
data: err.to_string(),
}),
}
}
fn printing(separator: &String, site: &Site, group: &PrintGroup) {
let string = site_string(site, print_group_to_options(group), separator);
println!("{}", string);
}
fn print_group_to_options(group: &PrintGroup) -> PrintOptions {
match group {
PrintGroup {
url: true,
name: false,
} => PrintOptions::Url,
PrintGroup {
url: false,
name: true,
} => PrintOptions::Name,
_ => PrintOptions::All,
}
}