diff --git a/src/cache/cache_line.rs b/src/cache/cache_line.rs index c8e50de..69f20e9 100644 --- a/src/cache/cache_line.rs +++ b/src/cache/cache_line.rs @@ -9,7 +9,7 @@ use crate::Hollidays; const CET: FixedOffset = unsafe { FixedOffset::east_opt(3600).unwrap_unchecked() }; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, PartialEq)] pub struct CacheLine { #[serde(with = "ts_seconds")] date: DateTime, @@ -86,6 +86,13 @@ impl CacheLine { } } } + +impl PartialEq> for CacheLine { + fn eq(&self, other: &Vec) -> bool { + &self.exchange_rate_results == other + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/main.rs b/src/main.rs index 9e016c1..4e128bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,12 +65,24 @@ async fn main() -> ExitCode { return ExitCode::FAILURE; } }; + if !cache_ok { - if let Some(cache_safe) = cache.as_mut() { - let cache_line = CacheLine::new(parsed.clone()); - cache_safe.set_cache_line(cli.resolution, cache_line); - if let Err(e) = cache_safe.save() { - eprintln!("Failed to save to cache with: {:?}", e); + let not_equal_cache = cache.as_ref().map_or_else( + || true, + |cache_local| { + cache_local + .get_cache_line(cli.resolution) + .map_or_else(|| true, |cache_line| cache_line == &parsed) + }, + ); + + if not_equal_cache { + if let Some(cache_safe) = cache.as_mut() { + let cache_line = CacheLine::new(parsed.clone()); + cache_safe.set_cache_line(cli.resolution, cache_line); + if let Err(e) = cache_safe.save() { + eprintln!("Failed to save to cache with: {:?}", e); + } } } } diff --git a/src/models.rs b/src/models.rs index 3caacf1..2b0dedc 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use std::collections::HashMap; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct ExchangeRateResult { pub time: String, pub rates: HashMap,