use super::{ make_balances_view_greeting::make_balances_view_greeting, view_group_names::view_group_names, Action, BalancesView, Message, }; use crate::{ gui::components::{navigation, Text}, traits::Component, }; impl<'a> Component<'a, Message, Action> for BalancesView { fn update(&mut self, message: Message) -> Action { match message { Message::NavigationMessage(message) => { update_navigation(self, message); Action::None } Message::SetBuckets(buckets) => { set_buckets(self, buckets); Action::None } Message::SelectNextBucket => { select_next_bucket(self); Action::None } Message::SelectPrevBucket => { select_prev_bucket(self); Action::None } } } } fn select_prev_bucket(balances_view: &mut BalancesView) -> () { match balances_view .navigation .update(navigation::Message::SelectPrev) { navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => { balances_view.greeting = make_balances_view_greeting(Some(option)); } navigation::Action::None => {} }; } fn select_next_bucket(balances_view: &mut BalancesView) -> () { match balances_view .navigation .update(navigation::Message::SelectNext) { navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => { balances_view.greeting = make_balances_view_greeting(Some(option)); } navigation::Action::None => {} }; } fn set_buckets(balances_view: &mut BalancesView, buckets: Vec) -> () { balances_view.buckets = buckets.clone(); match balances_view .navigation .update(navigation::Message::SetOptions(view_group_names(buckets))) { navigation::Action::ActivateOption(option) | navigation::Action::SelectOption(option) => { balances_view.greeting = make_balances_view_greeting(Some(option)); } navigation::Action::None => {} }; } fn update_navigation(balances_view: &mut BalancesView, message: navigation::Message) -> () { match balances_view.navigation.update(message) { navigation::Action::ActivateOption(group_name) | navigation::Action::SelectOption(group_name) => { balances_view.greeting = make_balances_view_greeting(Some(group_name)); } navigation::Action::None => {} }; } #[cfg(test)] mod test { use schist_fakes::bucket::make_fake_bucket_builder; use crate::{ gui::components::{ balances_view::{BalancesView, Message}, navigation, }, traits::Component, }; #[test] fn update_navigation_updates_greeting() { let groceries = make_fake_bucket_builder(0) .group(String::from("normal expenses")) .build() .unwrap(); let fragrance = make_fake_bucket_builder(1) .group(String::from("luxuries")) .build() .unwrap(); let maps = make_fake_bucket_builder(2) .group(String::from("outdoors")) .build() .unwrap(); let buckets = vec![groceries, fragrance.clone(), maps]; let mut balances_view = BalancesView::new(buckets); assert_eq!("Hello, normal expenses balances!", balances_view.greeting); balances_view.update(Message::NavigationMessage(navigation::Message::SelectPrev)); assert_eq!("Hello, normal expenses balances!", balances_view.greeting); balances_view.update(Message::NavigationMessage(navigation::Message::SelectPrev)); assert_eq!("Hello, normal expenses balances!", balances_view.greeting); balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext)); assert_eq!("Hello, luxuries balances!", balances_view.greeting); balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext)); assert_eq!("Hello, outdoors balances!", balances_view.greeting); balances_view.update(Message::NavigationMessage(navigation::Message::SelectNext)); assert_eq!("Hello, outdoors balances!", balances_view.greeting); } }