currency_conversion_cli/commands/
list.rs

1use 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}