From 5a5b31295512fb225085ea4606883d5a5bda0d2f Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 28 Mar 2025 16:02:03 +0200 Subject: [PATCH] use macro to define field setters --- src/model/metadata.rs | 99 +++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 64 deletions(-) diff --git a/src/model/metadata.rs b/src/model/metadata.rs index 51dd403..806cb53 100644 --- a/src/model/metadata.rs +++ b/src/model/metadata.rs @@ -159,72 +159,43 @@ impl Metadata { _ => None } } - pub fn set_artist (&mut self, value: &impl AsRef) -> Option { - match self { - Metadata::Music { artist, .. } => { - if artist.as_deref() != Some(value.as_ref()) { - *artist = Some(value.as_ref().into()); - Some(TagItem::new( - ItemKey::TrackArtist, - ItemValue::Text(value.as_ref().into()) - )); +} + +macro_rules! metadata_set_string { + ($name:ident, $field:ident, $key:expr) => { + impl Metadata { + pub fn $name (&mut self, value: &impl AsRef) -> Option { + if let Metadata::Music { $field, .. } = self + && Some(value.as_ref()) != $field.as_deref() + { + *$field = Some(value.as_ref().into()); + return Some(TagItem::new($key, ItemValue::Text(value.as_ref().into()))) } - //todo!("emit task"); None - }, - _ => None - } - } - pub fn set_year (&mut self, value: &impl AsRef ) -> Option { - match self { - Metadata::Music { year, .. } => { - if let Ok(value) = value.as_ref().trim().parse::() { - *year = Some(value); - } - Some(TagItem::new( - ItemKey::Year, - ItemValue::Text(value.as_ref().into()) - )) - }, - _ => None - } - } - pub fn set_album (&mut self, value: &impl AsRef) -> Option { - match self { - Metadata::Music { album, .. } => { - *album = Some(value.as_ref().into()); - Some(TagItem::new( - ItemKey::AlbumTitle, - ItemValue::Text(value.as_ref().into()) - )) - }, - _ => None - } - } - pub fn set_title (&mut self, value: &impl AsRef) -> Option { - match self { - Metadata::Music { title, .. } => { - *title = Some(value.as_ref().into()); - Some(TagItem::new( - ItemKey::TrackTitle, - ItemValue::Text(value.as_ref().into()) - )) - }, - _ => None - } - } - pub fn set_track (&mut self, value: &impl AsRef) -> Option { - match self { - Metadata::Music { track, .. } => { - if let Ok(value) = value.as_ref().trim().parse::() { - *track = Some(value); - } - Some(TagItem::new( - ItemKey::TrackNumber, - ItemValue::Text(value.as_ref().into()) - )) - }, - _ => None + } } } } + +macro_rules! metadata_set_number { + ($name:ident, $field:ident, $key:expr) => { + impl Metadata { + pub fn $name (&mut self, value: &impl AsRef) -> Option { + if let Metadata::Music { $field, .. } = self + && let Ok(value) = value.as_ref().trim().parse::() + && Some(value) != *$field + { + *$field = Some(value); + return Some(TagItem::new($key, ItemValue::Text(format!("{value}")))) + } + None + } + } + } +} + +metadata_set_string!(set_artist, artist, ItemKey::TrackArtist); +metadata_set_number!(set_year, track, ItemKey::Year); +metadata_set_string!(set_album, album, ItemKey::AlbumTitle); +metadata_set_number!(set_track, track, ItemKey::TrackNumber); +metadata_set_string!(set_title, title, ItemKey::TrackTitle);