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, 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, } }