qobuz_api/metadata/
config.rs1use std::collections::HashSet;
4
5use tracing::info;
6
7#[derive(Clone, Debug, PartialEq, Eq)]
12pub struct MetadataConfig {
13 enabled: HashSet<MetadataField>,
15}
16
17impl MetadataConfig {
18 #[must_use]
24 pub fn all() -> Self {
25 Self {
26 enabled: HashSet::from([
27 MetadataField::Title,
28 MetadataField::Artist,
29 MetadataField::Album,
30 MetadataField::AlbumArtist,
31 MetadataField::Genre,
32 MetadataField::ReleaseDate,
33 MetadataField::ReleaseYear,
34 MetadataField::Composer,
35 MetadataField::TrackNumber,
36 MetadataField::TrackTotal,
37 MetadataField::DiscNumber,
38 MetadataField::DiscTotal,
39 MetadataField::CoverArt,
40 MetadataField::Isrc,
41 MetadataField::Copyright,
42 MetadataField::Label,
43 MetadataField::MediaType,
44 MetadataField::Comment,
45 MetadataField::Producer,
46 MetadataField::InvolvedPeople,
47 MetadataField::Explicit,
48 MetadataField::Upc,
49 MetadataField::Url,
50 ]),
51 }
52 }
53
54 #[must_use]
64 pub fn is_enabled(&self, field: MetadataField) -> bool {
65 self.enabled.contains(&field)
66 }
67
68 pub fn set(&mut self, field: MetadataField, enabled: bool) {
75 if enabled {
76 let inserted = self.enabled.insert(field);
77 info!(field = ?field, inserted, "metadata field toggled");
78 } else {
79 let removed = self.enabled.remove(&field);
80 info!(field = ?field, removed, "metadata field toggled");
81 }
82 }
83}
84
85impl Default for MetadataConfig {
86 fn default() -> Self {
87 let mut config = Self::all();
88 let removed = config.enabled.remove(&MetadataField::Comment);
89 info!(removed, "default metadata config excludes comment");
90 config
91 }
92}
93
94#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
96pub enum MetadataField {
97 Title,
99 Artist,
101 Album,
103 AlbumArtist,
105 Genre,
107 ReleaseDate,
109 ReleaseYear,
111 Composer,
113 TrackNumber,
115 TrackTotal,
117 DiscNumber,
119 DiscTotal,
121 CoverArt,
123 Isrc,
125 Copyright,
127 Label,
129 MediaType,
131 Comment,
133 Producer,
135 InvolvedPeople,
137 Explicit,
139 Upc,
141 Url,
143}
144
145#[cfg(test)]
146mod tests {
147 use anyhow::{Result, ensure};
148
149 use crate::metadata::config::{
150 MetadataConfig,
151 MetadataField::{Comment, Producer, Title},
152 };
153
154 #[test]
160 fn default_excludes_comment() -> Result<()> {
161 let config = MetadataConfig::default();
162 ensure!(config.is_enabled(Title));
163 ensure!(!config.is_enabled(Comment));
164 Ok(())
165 }
166
167 #[test]
173 fn all_enables_every_field() -> Result<()> {
174 let config = MetadataConfig::all();
175 ensure!(config.is_enabled(Comment));
176 ensure!(config.is_enabled(Producer));
177 Ok(())
178 }
179
180 #[test]
186 fn set_toggles_field() -> Result<()> {
187 let mut config = MetadataConfig::default();
188 ensure!(!config.is_enabled(Comment));
189 config.set(Comment, true);
190 ensure!(config.is_enabled(Comment));
191 config.set(Comment, false);
192 ensure!(!config.is_enabled(Comment));
193 Ok(())
194 }
195}