From c6424ec0360607b0143c9b3fccfc4bcbd27fd071 Mon Sep 17 00:00:00 2001 From: Wojciech Kozlowski Date: Sat, 28 Sep 2024 09:08:56 +0200 Subject: [PATCH] Remove duplication re: miss options --- src/tui/app/machine/fetch_state.rs | 6 +- src/tui/app/machine/match_state.rs | 143 ++++++++++++----------------- src/tui/app/mod.rs | 42 +++------ src/tui/ui/display.rs | 40 ++++---- 4 files changed, 94 insertions(+), 137 deletions(-) diff --git a/src/tui/app/machine/fetch_state.rs b/src/tui/app/machine/fetch_state.rs index 59730b3..a56aff1 100644 --- a/src/tui/app/machine/fetch_state.rs +++ b/src/tui/app/machine/fetch_state.rs @@ -246,7 +246,7 @@ mod tests { use crate::tui::{ app::{ machine::tests::{inner, music_hoard}, - Delta, IApp, IAppAccess, IAppInteractBrowse, MatchStateInfo, MissOption, SearchOption, + Delta, IApp, IAppAccess, IAppInteractBrowse, MatchOption, MatchStateInfo, }, lib::interface::musicbrainz::{ self, @@ -503,8 +503,8 @@ mod tests { let match_state = public.state.unwrap_match(); let match_options = vec![ artist_match.into(), - SearchOption::None(MissOption::CannotHaveMbid), - SearchOption::None(MissOption::ManualInputMbid), + MatchOption::CannotHaveMbid, + MatchOption::ManualInputMbid, ]; let expected = MatchStateInfo::artist_search(artist, match_options); assert_eq!(match_state.info, Some(expected).as_ref()); diff --git a/src/tui/app/machine/match_state.rs b/src/tui/app/machine/match_state.rs index b90e979..6d0c980 100644 --- a/src/tui/app/machine/match_state.rs +++ b/src/tui/app/machine/match_state.rs @@ -10,91 +10,66 @@ use crate::tui::{ app::{ machine::{fetch_state::FetchState, input::Input, App, AppInner, AppMachine}, AlbumMatches, AppPublicState, AppState, ArtistMatches, IAppInteractMatch, ListOption, - LookupOption, MatchStateInfo, MatchStatePublic, MissOption, SearchOption, WidgetState, + MatchOption, MatchStateInfo, MatchStatePublic, WidgetState, + }, + lib::{ + interface::musicbrainz::api::{Lookup, Match}, + IMusicHoard, }, - lib::IMusicHoard, }; -impl LookupOption { - fn set( - self, - music_hoard: &mut dyn IMusicHoard, - meta: &ArtistMeta, - ) -> Result<(), musichoard::Error> { - let mbref = match self { - LookupOption::Match(lookup) => lookup.item.musicbrainz, - LookupOption::None(MissOption::CannotHaveMbid) => MbRefOption::CannotHaveMbid, - _ => panic!(), - }; - music_hoard.set_artist_musicbrainz(&meta.id, mbref) - } -} - -impl SearchOption { - fn set( - self, - music_hoard: &mut dyn IMusicHoard, - meta: &ArtistMeta, - ) -> Result<(), musichoard::Error> { - let mbref = match self { - SearchOption::Match(search) => search.item.musicbrainz, - SearchOption::None(MissOption::CannotHaveMbid) => MbRefOption::CannotHaveMbid, - _ => panic!(), - }; - music_hoard.set_artist_musicbrainz(&meta.id, mbref) - } -} - -impl LookupOption { - fn set( - self, - music_hoard: &mut dyn IMusicHoard, - artist: &ArtistId, - meta: &AlbumMeta, - ) -> Result<(), musichoard::Error> { - let (mbref, primary_type, secondary_types) = match self { - LookupOption::Match(lookup) => ( - lookup.item.musicbrainz, - lookup.item.primary_type, - lookup.item.secondary_types, - ), - LookupOption::None(MissOption::CannotHaveMbid) => { - (MbRefOption::CannotHaveMbid, None, Vec::new()) +macro_rules! item_option_artist_set { + ($holder:ident) => { + impl MatchOption<$holder> { + fn set( + self, + music_hoard: &mut dyn IMusicHoard, + meta: &ArtistMeta, + ) -> Result<(), musichoard::Error> { + let mbref = match self { + MatchOption::Some(m) => m.item.musicbrainz, + MatchOption::CannotHaveMbid => MbRefOption::CannotHaveMbid, + MatchOption::ManualInputMbid => panic!(), + }; + music_hoard.set_artist_musicbrainz(&meta.id, mbref) } - _ => panic!(), - }; - music_hoard.set_album_musicbrainz(artist, &meta.id, mbref)?; - music_hoard.set_album_primary_type(artist, &meta.id, primary_type)?; - music_hoard.set_album_secondary_types(artist, &meta.id, secondary_types)?; - Ok(()) - } + } + }; } -impl SearchOption { - fn set( - self, - music_hoard: &mut dyn IMusicHoard, - artist: &ArtistId, - meta: &AlbumMeta, - ) -> Result<(), musichoard::Error> { - let (mbref, primary_type, secondary_types) = match self { - SearchOption::Match(lookup) => ( - lookup.item.musicbrainz, - lookup.item.primary_type, - lookup.item.secondary_types, - ), - SearchOption::None(MissOption::CannotHaveMbid) => { - (MbRefOption::CannotHaveMbid, None, Vec::new()) +item_option_artist_set!(Lookup); +item_option_artist_set!(Match); + +macro_rules! item_option_album_set { + ($holder:ident) => { + impl MatchOption<$holder> { + fn set( + self, + music_hoard: &mut dyn IMusicHoard, + artist: &ArtistId, + meta: &AlbumMeta, + ) -> Result<(), musichoard::Error> { + let (mbref, primary_type, secondary_types) = match self { + MatchOption::Some(m) => ( + m.item.musicbrainz, + m.item.primary_type, + m.item.secondary_types, + ), + MatchOption::CannotHaveMbid => (MbRefOption::CannotHaveMbid, None, Vec::new()), + MatchOption::ManualInputMbid => panic!(), + }; + music_hoard.set_album_musicbrainz(artist, &meta.id, mbref)?; + music_hoard.set_album_primary_type(artist, &meta.id, primary_type)?; + music_hoard.set_album_secondary_types(artist, &meta.id, secondary_types)?; + Ok(()) } - _ => panic!(), - }; - music_hoard.set_album_musicbrainz(artist, &meta.id, mbref)?; - music_hoard.set_album_primary_type(artist, &meta.id, primary_type)?; - music_hoard.set_album_secondary_types(artist, &meta.id, secondary_types)?; - Ok(()) - } + } + }; } +item_option_album_set!(Lookup); +item_option_album_set!(Match); + impl ListOption { fn len(&self) -> usize { match self { @@ -105,26 +80,22 @@ impl ListOption { fn push_cannot_have_mbid(&mut self) { match self { - ListOption::Lookup(list) => list.push(LookupOption::None(MissOption::CannotHaveMbid)), - ListOption::Search(list) => list.push(SearchOption::None(MissOption::CannotHaveMbid)), + ListOption::Lookup(list) => list.push(MatchOption::CannotHaveMbid), + ListOption::Search(list) => list.push(MatchOption::CannotHaveMbid), } } fn push_manual_input_mbid(&mut self) { match self { - ListOption::Lookup(list) => list.push(LookupOption::None(MissOption::ManualInputMbid)), - ListOption::Search(list) => list.push(SearchOption::None(MissOption::ManualInputMbid)), + ListOption::Lookup(list) => list.push(MatchOption::ManualInputMbid), + ListOption::Search(list) => list.push(MatchOption::ManualInputMbid), } } fn is_manual_input_mbid(&self, index: usize) -> bool { match self { - ListOption::Lookup(list) => { - list.get(index) == Some(&LookupOption::None(MissOption::ManualInputMbid)) - } - ListOption::Search(list) => { - list.get(index) == Some(&SearchOption::None(MissOption::ManualInputMbid)) - } + ListOption::Lookup(list) => list.get(index) == Some(&MatchOption::ManualInputMbid), + ListOption::Search(list) => list.get(index) == Some(&MatchOption::ManualInputMbid), } } } diff --git a/src/tui/app/mod.rs b/src/tui/app/mod.rs index e36a195..98ef76a 100644 --- a/src/tui/app/mod.rs +++ b/src/tui/app/mod.rs @@ -181,38 +181,21 @@ pub struct AppPublicInner<'app> { pub type InputPublic<'app> = &'app tui_input::Input; #[derive(Clone, Debug, PartialEq, Eq)] -pub enum MissOption { +pub enum MatchOption { + Some(T), CannotHaveMbid, ManualInputMbid, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum SearchOption { - Match(Match), - None(MissOption), -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum LookupOption { - Match(Lookup), - None(MissOption), -} - #[derive(Clone, Debug, PartialEq, Eq)] pub enum ListOption { - Search(Vec>), - Lookup(Vec>), + Search(Vec>>), + Lookup(Vec>>), } -impl From> for SearchOption { - fn from(value: Match) -> Self { - SearchOption::Match(value) - } -} - -impl From> for LookupOption { - fn from(value: Lookup) -> Self { - LookupOption::Match(value) +impl From for MatchOption { + fn from(value: T) -> Self { + MatchOption::Some(value) } } @@ -236,7 +219,7 @@ pub enum MatchStateInfo { } impl MatchStateInfo { - pub fn artist_search>>( + pub fn artist_search>>>( matching: ArtistMeta, list: Vec, ) -> Self { @@ -244,7 +227,7 @@ impl MatchStateInfo { MatchStateInfo::Artist(ArtistMatches { matching, list }) } - pub fn album_search>>( + pub fn album_search>>>( artist: ArtistId, matching: AlbumMeta, list: Vec, @@ -257,12 +240,15 @@ impl MatchStateInfo { }) } - pub fn artist_lookup>>(matching: ArtistMeta, item: M) -> Self { + pub fn artist_lookup>>>( + matching: ArtistMeta, + item: M, + ) -> Self { let list = ListOption::Lookup(vec![item.into()]); MatchStateInfo::Artist(ArtistMatches { matching, list }) } - pub fn album_lookup>>( + pub fn album_lookup>>>( artist: ArtistId, matching: AlbumMeta, item: M, diff --git a/src/tui/ui/display.rs b/src/tui/ui/display.rs index 49972c2..33e5075 100644 --- a/src/tui/ui/display.rs +++ b/src/tui/ui/display.rs @@ -5,7 +5,10 @@ use musichoard::collection::{ track::{TrackFormat, TrackQuality}, }; -use crate::tui::app::{LookupOption, MatchStateInfo, MissOption, SearchOption}; +use crate::tui::{ + app::{MatchOption, MatchStateInfo}, + lib::interface::musicbrainz::api::{Lookup, Match}, +}; pub struct UiDisplay; @@ -133,23 +136,25 @@ impl UiDisplay { } } - pub fn display_search_option_artist(match_option: &SearchOption) -> String { + pub fn display_search_option_artist(match_option: &MatchOption>) -> String { match match_option { - SearchOption::Match(match_artist) => format!( + MatchOption::Some(match_artist) => format!( "{} ({}%)", Self::display_option_artist(&match_artist.item, &match_artist.disambiguation), match_artist.score, ), - SearchOption::None(miss) => Self::display_miss_option(miss).to_string(), + MatchOption::CannotHaveMbid => Self::display_cannot_have_mbid().to_string(), + MatchOption::ManualInputMbid => Self::display_manual_input_mbid().to_string(), } } - pub fn display_lookup_option_artist(lookup_option: &LookupOption) -> String { + pub fn display_lookup_option_artist(lookup_option: &MatchOption>) -> String { match lookup_option { - LookupOption::Match(match_artist) => { + MatchOption::Some(match_artist) => { Self::display_option_artist(&match_artist.item, &match_artist.disambiguation) } - LookupOption::None(miss) => Self::display_miss_option(miss).to_string(), + MatchOption::CannotHaveMbid => Self::display_cannot_have_mbid().to_string(), + MatchOption::ManualInputMbid => Self::display_manual_input_mbid().to_string(), } } @@ -165,21 +170,23 @@ impl UiDisplay { ) } - pub fn display_search_option_album(match_option: &SearchOption) -> String { + pub fn display_search_option_album(match_option: &MatchOption>) -> String { match match_option { - SearchOption::Match(match_album) => format!( + MatchOption::Some(match_album) => format!( "{} ({}%)", Self::display_option_album(&match_album.item), match_album.score, ), - SearchOption::None(miss) => Self::display_miss_option(miss).to_string(), + MatchOption::CannotHaveMbid => Self::display_cannot_have_mbid().to_string(), + MatchOption::ManualInputMbid => Self::display_manual_input_mbid().to_string(), } } - pub fn display_lookup_option_album(lookup_option: &LookupOption) -> String { + pub fn display_lookup_option_album(lookup_option: &MatchOption>) -> String { match lookup_option { - LookupOption::Match(match_album) => Self::display_option_album(&match_album.item), - LookupOption::None(miss) => Self::display_miss_option(miss).to_string(), + MatchOption::Some(match_album) => Self::display_option_album(&match_album.item), + MatchOption::CannotHaveMbid => Self::display_cannot_have_mbid().to_string(), + MatchOption::ManualInputMbid => Self::display_manual_input_mbid().to_string(), } } @@ -192,13 +199,6 @@ impl UiDisplay { ) } - fn display_miss_option(miss_option: &MissOption) -> &'static str { - match miss_option { - MissOption::CannotHaveMbid => Self::display_cannot_have_mbid(), - MissOption::ManualInputMbid => Self::display_manual_input_mbid(), - } - } - fn display_cannot_have_mbid() -> &'static str { "-- Cannot have a MusicBrainz Identifier --" }