diff --git a/src/keys/edit.rs b/src/keys/edit.rs index 00c4b08..1a3542d 100644 --- a/src/keys/edit.rs +++ b/src/keys/edit.rs @@ -18,10 +18,7 @@ impl Taggart { { let value = (column.getter)(&self.entries[self.cursor]); let value = format!("{}", value.unwrap_or_default()); - self.mode = Some(Mode::Edit { - index: value.len(), - value: value.into(), - }); + self.mode = Some(Mode::Edit { index: value.len(), value: value.into(), }); } } pub fn edit_cancel (&mut self) { diff --git a/src/model/entry.rs b/src/model/entry.rs index 61cdbbd..dd1013f 100644 --- a/src/model/entry.rs +++ b/src/model/entry.rs @@ -1,6 +1,5 @@ use crate::*; use std::cmp::{Eq, PartialEq, Ord, PartialOrd, Ordering}; -use lofty::tag::TagItem; pub struct Entry { /// How many levels deep is this from the working directory @@ -50,42 +49,6 @@ impl Entry { pub fn is_image (&self) -> bool { matches!(&*self.info.read().unwrap(), Metadata::Image { .. }) } - pub fn hash (&self) -> Option> { - self.info.read().unwrap().hash() - } - pub fn size (&self) -> Option> { - self.info.read().unwrap().size() - } - pub fn artist (&self) -> Option> { - self.info.read().unwrap().artist() - } - pub fn year (&self) -> Option> { - self.info.read().unwrap().year() - } - pub fn album (&self) -> Option> { - self.info.read().unwrap().album() - } - pub fn title (&self) -> Option> { - self.info.read().unwrap().title() - } - pub fn track (&self) -> Option> { - self.info.read().unwrap().track() - } - pub fn set_artist (&self, value: &impl AsRef) -> Option { - self.info.write().unwrap().set_artist(value) - } - pub fn set_year (&self, value: &impl AsRef) -> Option { - self.info.write().unwrap().set_year(value) - } - pub fn set_album (&self, value: &impl AsRef) -> Option { - self.info.write().unwrap().set_album(value) - } - pub fn set_title (&self, value: &impl AsRef) -> Option { - self.info.write().unwrap().set_title(value) - } - pub fn set_track (&self, value: &impl AsRef) -> Option { - self.info.write().unwrap().set_track(value) - } pub const ICON_DIRECTORY: &'static str = ""; pub const ICON_IMAGE: &'static str = "󰋩"; pub const ICON_MUSIC: &'static str = ""; diff --git a/src/model/metadata.rs b/src/model/metadata.rs index a76cc13..fbe3b67 100644 --- a/src/model/metadata.rs +++ b/src/model/metadata.rs @@ -104,26 +104,47 @@ impl Metadata { hash: hex::encode(xxh3_64(&bytes).to_be_bytes()).into(), }) } - pub fn hash (&self) -> Option> { - match self { - Metadata::Image { hash, .. } => Some(hash.clone()), - Metadata::Music { hash, .. } => Some(hash.clone()), - Metadata::Unknown { hash, .. } => Some(hash.clone()), - _ => None +} + +macro_rules! generated_field { + ($get:ident = |$self:ident| $expr:expr) => { + impl Entry { + pub fn $get (&$self) -> Option> { + $self.info.read().unwrap().$get() + } } - } - pub fn size (&self) -> Option> { - match self { - Metadata::Image { size, .. } => Some(size.clone()), - Metadata::Music { size, .. } => Some(size.clone()), - Metadata::Unknown { size, .. } => Some(size.clone()), - _ => None + impl Metadata { + pub fn $get (&$self) -> Option> { + $expr + } } } } +generated_field!(hash = |self|match self { + Metadata::Image { hash, .. } => Some(hash.clone()), + Metadata::Music { hash, .. } => Some(hash.clone()), + Metadata::Unknown { hash, .. } => Some(hash.clone()), + _ => None +}); + +generated_field!(size = |self|match self { + Metadata::Image { size, .. } => Some(size.clone()), + Metadata::Music { size, .. } => Some(size.clone()), + Metadata::Unknown { size, .. } => Some(size.clone()), + _ => None +}); + macro_rules! music_tag_field { (string: $get:ident $set:ident $del:ident $key:expr) => { + impl Entry { + pub fn $get (&self) -> Option> { + self.info.read().unwrap().$get() + } + pub fn $set (&mut self, value: &impl AsRef) -> Option { + self.info.write().unwrap().$set(value) + } + } impl Metadata { pub fn $get (&self) -> Option> { if let Metadata::Music { original_tag, modified_tag, .. } = self { @@ -169,6 +190,14 @@ macro_rules! music_tag_field { } }; (number: $get:ident $set:ident $del:ident $key:expr) => { + impl Entry { + pub fn $get (&self) -> Option> { + self.info.read().unwrap().$get() + } + pub fn $set (&mut self, value: &impl AsRef) -> Option { + self.info.write().unwrap().$set(value) + } + } impl Metadata { pub fn $get (&self) -> Option> { if let Metadata::Music { original_tag, modified_tag, .. } = self {