use std::collections::HashSet;
#[derive(Clone, Debug, PartialEq)]
pub struct MetadataConfig {
enabled: HashSet<MetadataField>,
}
impl MetadataConfig {
#[must_use]
pub fn all() -> Self {
Self {
enabled: HashSet::from([
MetadataField::Title,
MetadataField::Artist,
MetadataField::Album,
MetadataField::AlbumArtist,
MetadataField::Genre,
MetadataField::ReleaseDate,
MetadataField::ReleaseYear,
MetadataField::Composer,
MetadataField::TrackNumber,
MetadataField::TrackTotal,
MetadataField::DiscNumber,
MetadataField::DiscTotal,
MetadataField::CoverArt,
MetadataField::Isrc,
MetadataField::Copyright,
MetadataField::Label,
MetadataField::MediaType,
MetadataField::Comment,
MetadataField::Producer,
MetadataField::InvolvedPeople,
MetadataField::Explicit,
MetadataField::Upc,
MetadataField::Url,
]),
}
}
#[must_use]
pub fn is_enabled(&self, field: MetadataField) -> bool {
self.enabled.contains(&field)
}
pub fn set(&mut self, field: MetadataField, enabled: bool) {
if enabled {
self.enabled.insert(field);
} else {
self.enabled.remove(&field);
}
}
}
impl Default for MetadataConfig {
fn default() -> Self {
let mut config = Self::all();
config.enabled.remove(&MetadataField::Comment);
config
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum MetadataField {
Title,
Artist,
Album,
AlbumArtist,
Genre,
ReleaseDate,
ReleaseYear,
Composer,
TrackNumber,
TrackTotal,
DiscNumber,
DiscTotal,
CoverArt,
Isrc,
Copyright,
Label,
MediaType,
Comment,
Producer,
InvolvedPeople,
Explicit,
Upc,
Url,
}
#[cfg(test)]
mod tests {
use anyhow::{Result, ensure};
use crate::metadata::config::{
MetadataConfig,
MetadataField::{Comment, Producer, Title},
};
#[test]
fn default_excludes_comment() -> Result<()> {
let config = MetadataConfig::default();
ensure!(config.is_enabled(Title));
ensure!(!config.is_enabled(Comment));
Ok(())
}
#[test]
fn all_enables_every_field() -> Result<()> {
let config = MetadataConfig::all();
ensure!(config.is_enabled(Comment));
ensure!(config.is_enabled(Producer));
Ok(())
}
#[test]
fn set_toggles_field() -> Result<()> {
let mut config = MetadataConfig::default();
ensure!(!config.is_enabled(Comment));
config.set(Comment, true);
ensure!(config.is_enabled(Comment));
config.set(Comment, false);
ensure!(!config.is_enabled(Comment));
Ok(())
}
}