89 lines
1.7 KiB
Rust
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,
|
|
}
|
|
}
|