currency_conversion_cli/commands/
list.rs1use anyhow::Result;
2use currency_conversion::common::conversion_rate::ConversionRate;
3use currency_conversion::common::load_data;
4use currency_conversion::common::supported_symbols::Symbols;
5use currency_conversion::list::list_data::list_data;
6use currency_conversion::list::list_data::ListDataItem;
7use serde::Deserialize;
8use std::path::Path;
9
10use crate::{
11 cli::{ListArgs, ListDataSet},
12 config::Config,
13};
14
15#[cfg(not(tarpaulin_include))]
16pub fn run_list(config: &Config, args: &ListArgs) -> Result<()> {
17 match args.dataset {
18 ListDataSet::Symbols => load_and_list_data::<Symbols>(&config.symbols_file_path)?,
19 ListDataSet::ConversionRates => {
20 load_and_list_data::<ConversionRate>(&config.conversion_rates_file_path)?
21 }
22 };
23 Ok(())
24}
25
26#[cfg(not(tarpaulin_include))]
27fn load_and_list_data<T>(path: &str) -> Result<()>
28where
29 T: ListDataItem + for<'de> Deserialize<'de> + Ord,
30{
31 let mut data: Vec<T> = load_data(Path::new(&path))?;
32
33 data.sort();
34
35 println!("{}", list_data(&data)?);
36
37 Ok(())
38}