From 19646e00014421d1e5db04fa6ebc29d639024463 Mon Sep 17 00:00:00 2001 From: Love Billenius Date: Wed, 8 Jan 2025 21:03:15 +0100 Subject: [PATCH] Perspective --- src/main.rs | 13 +++++++++++-- src/table/table_display.rs | 2 +- src/utils_calc.rs | 27 ++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 644ddfc..8737a5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,14 @@ use clap::Parser as _; +use core::error; use ecb_rates::cache::{Cache, CacheLine}; -use reqwest::{Client, IntoUrl}; +use reqwest::{Client, IntoUrl, StatusCode}; use std::process::ExitCode; use ecb_rates::cli::{Cli, FormatOption}; use ecb_rates::models::ExchangeRateResult; use ecb_rates::parsing::parse; use ecb_rates::table::{TableRef, TableTrait as _}; -use ecb_rates::utils_calc::filter_currencies; +use ecb_rates::utils_calc::{change_perspective, filter_currencies}; async fn get_and_parse(url: impl IntoUrl) -> anyhow::Result> { let client = Client::new(); @@ -72,6 +73,14 @@ async fn main() -> ExitCode { parsed }; + if let Some(currency) = cli.perspective { + let error_occured = change_perspective(&mut parsed, ¤cy).is_none(); + if error_occured { + eprintln!("The currency wasn't in the data from the ECB!"); + return ExitCode::FAILURE; + } + } + if !cli.currencies.is_empty() { let currencies = cli .currencies diff --git a/src/table/table_display.rs b/src/table/table_display.rs index 25821f6..69a479f 100644 --- a/src/table/table_display.rs +++ b/src/table/table_display.rs @@ -36,7 +36,7 @@ pub fn helper_table_print( for (left, right) in table.get_rows().iter() { let left_str = left.as_ref(); - let right_str = right.to_string(); + let right_str = format!("{:.5}", right); let padding_amount = width.saturating_sub(left_str.len() + right_str.len()); let padding = " ".repeat(padding_amount); writeln!(f, "{}{}{}", left_str.bold().green(), padding, right_str)?; diff --git a/src/utils_calc.rs b/src/utils_calc.rs index f3a21cb..26e0695 100644 --- a/src/utils_calc.rs +++ b/src/utils_calc.rs @@ -1,4 +1,4 @@ -use std::{borrow::BorrowMut, collections::HashMap}; +use std::{borrow::BorrowMut, collections::HashMap, ops::Deref}; use crate::models::ExchangeRateResult; @@ -19,3 +19,28 @@ pub fn filter_currencies(exchange_rate_results: &mut [ExchangeRateResult], curre }); } } + +pub fn change_perspective( + exchange_rate_results: &mut [ExchangeRateResult], + currency: &str, +) -> Option<()> { + for rate_res in exchange_rate_results { + let currency_rate = rate_res.rates.remove(currency)?; + let eur_rate = 1.0 / currency_rate; + + for (_, iter_rate) in rate_res.rates.iter_mut() { + *iter_rate = eur_rate * iter_rate.deref(); + } + + rate_res.rates.insert("EUR".to_string(), eur_rate); + } + Some(()) +} + +pub fn invert_rates(exchange_rate_results: &mut [ExchangeRateResult]) { + for rate_res in exchange_rate_results { + for (_, iter_rate) in rate_res.rates.iter_mut() { + *iter_rate = 1.0 / *iter_rate; + } + } +}