use crate::{ident, Data, Userdata};
impl Userdata {
pub fn album(&self) -> Option<&str> {
self.strings_of(&ident::ALBUM).next()
}
pub fn take_album(&mut self) -> Option<String> {
self.take_strings_of(&ident::ALBUM).next()
}
pub fn set_album(&mut self, album: impl Into<String>) {
self.set_data(ident::ALBUM, Data::Utf8(album.into()));
}
pub fn remove_album(&mut self) {
self.remove_data_of(&ident::ALBUM);
}
#[allow(unused)]
pub(crate) fn format_album(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.album() {
Some(s) => writeln!(f, "album: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn copyright(&self) -> Option<&str> {
self.strings_of(&ident::COPYRIGHT).next()
}
pub fn take_copyright(&mut self) -> Option<String> {
self.take_strings_of(&ident::COPYRIGHT).next()
}
pub fn set_copyright(&mut self, copyright: impl Into<String>) {
self.set_data(ident::COPYRIGHT, Data::Utf8(copyright.into()));
}
pub fn remove_copyright(&mut self) {
self.remove_data_of(&ident::COPYRIGHT);
}
#[allow(unused)]
pub(crate) fn format_copyright(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.copyright() {
Some(s) => writeln!(f, "copyright: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn encoder(&self) -> Option<&str> {
self.strings_of(&ident::ENCODER).next()
}
pub fn take_encoder(&mut self) -> Option<String> {
self.take_strings_of(&ident::ENCODER).next()
}
pub fn set_encoder(&mut self, encoder: impl Into<String>) {
self.set_data(ident::ENCODER, Data::Utf8(encoder.into()));
}
pub fn remove_encoder(&mut self) {
self.remove_data_of(&ident::ENCODER);
}
#[allow(unused)]
pub(crate) fn format_encoder(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.encoder() {
Some(s) => writeln!(f, "encoder: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn lyrics(&self) -> Option<&str> {
self.strings_of(&ident::LYRICS).next()
}
pub fn take_lyrics(&mut self) -> Option<String> {
self.take_strings_of(&ident::LYRICS).next()
}
pub fn set_lyrics(&mut self, lyrics: impl Into<String>) {
self.set_data(ident::LYRICS, Data::Utf8(lyrics.into()));
}
pub fn remove_lyrics(&mut self) {
self.remove_data_of(&ident::LYRICS);
}
#[allow(unused)]
pub(crate) fn format_lyrics(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.lyrics() {
Some(s) => writeln!(f, "lyrics: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn movement(&self) -> Option<&str> {
self.strings_of(&ident::MOVEMENT).next()
}
pub fn take_movement(&mut self) -> Option<String> {
self.take_strings_of(&ident::MOVEMENT).next()
}
pub fn set_movement(&mut self, movement: impl Into<String>) {
self.set_data(ident::MOVEMENT, Data::Utf8(movement.into()));
}
pub fn remove_movement(&mut self) {
self.remove_data_of(&ident::MOVEMENT);
}
#[allow(unused)]
pub(crate) fn format_movement(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.movement() {
Some(s) => writeln!(f, "movement: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn title(&self) -> Option<&str> {
self.strings_of(&ident::TITLE).next()
}
pub fn take_title(&mut self) -> Option<String> {
self.take_strings_of(&ident::TITLE).next()
}
pub fn set_title(&mut self, title: impl Into<String>) {
self.set_data(ident::TITLE, Data::Utf8(title.into()));
}
pub fn remove_title(&mut self) {
self.remove_data_of(&ident::TITLE);
}
#[allow(unused)]
pub(crate) fn format_title(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.title() {
Some(s) => writeln!(f, "title: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_episode_name(&self) -> Option<&str> {
self.strings_of(&ident::TV_EPISODE_NAME).next()
}
pub fn take_tv_episode_name(&mut self) -> Option<String> {
self.take_strings_of(&ident::TV_EPISODE_NAME).next()
}
pub fn set_tv_episode_name(&mut self, tv_episode_name: impl Into<String>) {
self.set_data(ident::TV_EPISODE_NAME, Data::Utf8(tv_episode_name.into()));
}
pub fn remove_tv_episode_name(&mut self) {
self.remove_data_of(&ident::TV_EPISODE_NAME);
}
#[allow(unused)]
pub(crate) fn format_tv_episode_name(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_episode_name() {
Some(s) => writeln!(f, "tv episode name: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_network_name(&self) -> Option<&str> {
self.strings_of(&ident::TV_NETWORK_NAME).next()
}
pub fn take_tv_network_name(&mut self) -> Option<String> {
self.take_strings_of(&ident::TV_NETWORK_NAME).next()
}
pub fn set_tv_network_name(&mut self, tv_network_name: impl Into<String>) {
self.set_data(ident::TV_NETWORK_NAME, Data::Utf8(tv_network_name.into()));
}
pub fn remove_tv_network_name(&mut self) {
self.remove_data_of(&ident::TV_NETWORK_NAME);
}
#[allow(unused)]
pub(crate) fn format_tv_network_name(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_network_name() {
Some(s) => writeln!(f, "tv network name: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_show_name(&self) -> Option<&str> {
self.strings_of(&ident::TV_SHOW_NAME).next()
}
pub fn take_tv_show_name(&mut self) -> Option<String> {
self.take_strings_of(&ident::TV_SHOW_NAME).next()
}
pub fn set_tv_show_name(&mut self, tv_show_name: impl Into<String>) {
self.set_data(ident::TV_SHOW_NAME, Data::Utf8(tv_show_name.into()));
}
pub fn remove_tv_show_name(&mut self) {
self.remove_data_of(&ident::TV_SHOW_NAME);
}
#[allow(unused)]
pub(crate) fn format_tv_show_name(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_show_name() {
Some(s) => writeln!(f, "tv show name: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn work(&self) -> Option<&str> {
self.strings_of(&ident::WORK).next()
}
pub fn take_work(&mut self) -> Option<String> {
self.take_strings_of(&ident::WORK).next()
}
pub fn set_work(&mut self, work: impl Into<String>) {
self.set_data(ident::WORK, Data::Utf8(work.into()));
}
pub fn remove_work(&mut self) {
self.remove_data_of(&ident::WORK);
}
#[allow(unused)]
pub(crate) fn format_work(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.work() {
Some(s) => writeln!(f, "work: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn year(&self) -> Option<&str> {
self.strings_of(&ident::YEAR).next()
}
pub fn take_year(&mut self) -> Option<String> {
self.take_strings_of(&ident::YEAR).next()
}
pub fn set_year(&mut self, year: impl Into<String>) {
self.set_data(ident::YEAR, Data::Utf8(year.into()));
}
pub fn remove_year(&mut self) {
self.remove_data_of(&ident::YEAR);
}
#[allow(unused)]
pub(crate) fn format_year(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.year() {
Some(s) => writeln!(f, "year: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn isrc(&self) -> Option<&str> {
self.strings_of(&ident::ISRC).next()
}
pub fn take_isrc(&mut self) -> Option<String> {
self.take_strings_of(&ident::ISRC).next()
}
pub fn set_isrc(&mut self, isrc: impl Into<String>) {
self.set_data(ident::ISRC, Data::Utf8(isrc.into()));
}
pub fn remove_isrc(&mut self) {
self.remove_data_of(&ident::ISRC);
}
#[allow(unused)]
pub(crate) fn format_isrc(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.isrc() {
Some(s) => writeln!(f, "isrc: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn label(&self) -> Option<&str> {
self.strings_of(&ident::LABEL).next()
}
pub fn take_label(&mut self) -> Option<String> {
self.take_strings_of(&ident::LABEL).next()
}
pub fn set_label(&mut self, label: impl Into<String>) {
self.set_data(ident::LABEL, Data::Utf8(label.into()));
}
pub fn remove_label(&mut self) {
self.remove_data_of(&ident::LABEL);
}
#[allow(unused)]
pub(crate) fn format_label(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.label() {
Some(s) => writeln!(f, "label: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn album_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::ALBUM_SORT_ORDER).next()
}
pub fn take_album_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::ALBUM_SORT_ORDER).next()
}
pub fn set_album_sort_order(&mut self, album_sort_order: impl Into<String>) {
self.set_data(ident::ALBUM_SORT_ORDER, Data::Utf8(album_sort_order.into()));
}
pub fn remove_album_sort_order(&mut self) {
self.remove_data_of(&ident::ALBUM_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_album_sort_order(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.album_sort_order() {
Some(s) => writeln!(f, "album sort order: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn title_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::TITLE_SORT_ORDER).next()
}
pub fn take_title_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::TITLE_SORT_ORDER).next()
}
pub fn set_title_sort_order(&mut self, title_sort_order: impl Into<String>) {
self.set_data(ident::TITLE_SORT_ORDER, Data::Utf8(title_sort_order.into()));
}
pub fn remove_title_sort_order(&mut self) {
self.remove_data_of(&ident::TITLE_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_title_sort_order(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.title_sort_order() {
Some(s) => writeln!(f, "title sort order: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_show_name_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::TV_SHOW_NAME_SORT_ORDER).next()
}
pub fn take_tv_show_name_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::TV_SHOW_NAME_SORT_ORDER).next()
}
pub fn set_tv_show_name_sort_order(&mut self, tv_show_name_sort_order: impl Into<String>) {
self.set_data(ident::TV_SHOW_NAME_SORT_ORDER, Data::Utf8(tv_show_name_sort_order.into()));
}
pub fn remove_tv_show_name_sort_order(&mut self) {
self.remove_data_of(&ident::TV_SHOW_NAME_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_tv_show_name_sort_order(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_show_name_sort_order() {
Some(s) => writeln!(f, "tv show name sort order: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn album_artists(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::ALBUM_ARTIST)
}
pub fn album_artist(&self) -> Option<&str> {
self.strings_of(&ident::ALBUM_ARTIST).next()
}
pub fn take_album_artists(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::ALBUM_ARTIST)
}
pub fn take_album_artist(&mut self) -> Option<String> {
self.take_strings_of(&ident::ALBUM_ARTIST).next()
}
pub fn set_album_artists(&mut self, album_artists: impl IntoIterator<Item = String>) {
let data = album_artists.into_iter().map(Data::Utf8);
self.set_all_data(ident::ALBUM_ARTIST, data);
}
pub fn set_album_artist(&mut self, album_artist: impl Into<String>) {
self.set_data(ident::ALBUM_ARTIST, Data::Utf8(album_artist.into()));
}
pub fn add_album_artists(&mut self, album_artists: impl IntoIterator<Item = String>) {
let data = album_artists.into_iter().map(Data::Utf8);
self.add_all_data(ident::ALBUM_ARTIST, data);
}
pub fn add_album_artist(&mut self, album_artist: impl Into<String>) {
self.add_data(ident::ALBUM_ARTIST, Data::Utf8(album_artist.into()));
}
pub fn remove_album_artists(&mut self) {
self.remove_data_of(&ident::ALBUM_ARTIST);
}
#[allow(unused)]
pub(crate) fn format_album_artists(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.album_artists().count() > 1 {
writeln!(f, "album artists:")?;
for s in self.album_artists() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.album_artist() {
writeln!(f, "album artist: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn artists(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::ARTIST)
}
pub fn artist(&self) -> Option<&str> {
self.strings_of(&ident::ARTIST).next()
}
pub fn take_artists(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::ARTIST)
}
pub fn take_artist(&mut self) -> Option<String> {
self.take_strings_of(&ident::ARTIST).next()
}
pub fn set_artists(&mut self, artists: impl IntoIterator<Item = String>) {
let data = artists.into_iter().map(Data::Utf8);
self.set_all_data(ident::ARTIST, data);
}
pub fn set_artist(&mut self, artist: impl Into<String>) {
self.set_data(ident::ARTIST, Data::Utf8(artist.into()));
}
pub fn add_artists(&mut self, artists: impl IntoIterator<Item = String>) {
let data = artists.into_iter().map(Data::Utf8);
self.add_all_data(ident::ARTIST, data);
}
pub fn add_artist(&mut self, artist: impl Into<String>) {
self.add_data(ident::ARTIST, Data::Utf8(artist.into()));
}
pub fn remove_artists(&mut self) {
self.remove_data_of(&ident::ARTIST);
}
#[allow(unused)]
pub(crate) fn format_artists(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.artists().count() > 1 {
writeln!(f, "artists:")?;
for s in self.artists() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.artist() {
writeln!(f, "artist: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn categories(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::CATEGORY)
}
pub fn category(&self) -> Option<&str> {
self.strings_of(&ident::CATEGORY).next()
}
pub fn take_categories(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::CATEGORY)
}
pub fn take_category(&mut self) -> Option<String> {
self.take_strings_of(&ident::CATEGORY).next()
}
pub fn set_categories(&mut self, categories: impl IntoIterator<Item = String>) {
let data = categories.into_iter().map(Data::Utf8);
self.set_all_data(ident::CATEGORY, data);
}
pub fn set_category(&mut self, category: impl Into<String>) {
self.set_data(ident::CATEGORY, Data::Utf8(category.into()));
}
pub fn add_categories(&mut self, categories: impl IntoIterator<Item = String>) {
let data = categories.into_iter().map(Data::Utf8);
self.add_all_data(ident::CATEGORY, data);
}
pub fn add_category(&mut self, category: impl Into<String>) {
self.add_data(ident::CATEGORY, Data::Utf8(category.into()));
}
pub fn remove_categories(&mut self) {
self.remove_data_of(&ident::CATEGORY);
}
#[allow(unused)]
pub(crate) fn format_categories(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.categories().count() > 1 {
writeln!(f, "categories:")?;
for s in self.categories() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.category() {
writeln!(f, "category: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn comments(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::COMMENT)
}
pub fn comment(&self) -> Option<&str> {
self.strings_of(&ident::COMMENT).next()
}
pub fn take_comments(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::COMMENT)
}
pub fn take_comment(&mut self) -> Option<String> {
self.take_strings_of(&ident::COMMENT).next()
}
pub fn set_comments(&mut self, comments: impl IntoIterator<Item = String>) {
let data = comments.into_iter().map(Data::Utf8);
self.set_all_data(ident::COMMENT, data);
}
pub fn set_comment(&mut self, comment: impl Into<String>) {
self.set_data(ident::COMMENT, Data::Utf8(comment.into()));
}
pub fn add_comments(&mut self, comments: impl IntoIterator<Item = String>) {
let data = comments.into_iter().map(Data::Utf8);
self.add_all_data(ident::COMMENT, data);
}
pub fn add_comment(&mut self, comment: impl Into<String>) {
self.add_data(ident::COMMENT, Data::Utf8(comment.into()));
}
pub fn remove_comments(&mut self) {
self.remove_data_of(&ident::COMMENT);
}
#[allow(unused)]
pub(crate) fn format_comments(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.comments().count() > 1 {
writeln!(f, "comments:")?;
for s in self.comments() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.comment() {
writeln!(f, "comment: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn composers(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::COMPOSER)
}
pub fn composer(&self) -> Option<&str> {
self.strings_of(&ident::COMPOSER).next()
}
pub fn take_composers(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::COMPOSER)
}
pub fn take_composer(&mut self) -> Option<String> {
self.take_strings_of(&ident::COMPOSER).next()
}
pub fn set_composers(&mut self, composers: impl IntoIterator<Item = String>) {
let data = composers.into_iter().map(Data::Utf8);
self.set_all_data(ident::COMPOSER, data);
}
pub fn set_composer(&mut self, composer: impl Into<String>) {
self.set_data(ident::COMPOSER, Data::Utf8(composer.into()));
}
pub fn add_composers(&mut self, composers: impl IntoIterator<Item = String>) {
let data = composers.into_iter().map(Data::Utf8);
self.add_all_data(ident::COMPOSER, data);
}
pub fn add_composer(&mut self, composer: impl Into<String>) {
self.add_data(ident::COMPOSER, Data::Utf8(composer.into()));
}
pub fn remove_composers(&mut self) {
self.remove_data_of(&ident::COMPOSER);
}
#[allow(unused)]
pub(crate) fn format_composers(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.composers().count() > 1 {
writeln!(f, "composers:")?;
for s in self.composers() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.composer() {
writeln!(f, "composer: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn custom_genres(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::CUSTOM_GENRE)
}
pub fn custom_genre(&self) -> Option<&str> {
self.strings_of(&ident::CUSTOM_GENRE).next()
}
pub fn take_custom_genres(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::CUSTOM_GENRE)
}
pub fn take_custom_genre(&mut self) -> Option<String> {
self.take_strings_of(&ident::CUSTOM_GENRE).next()
}
pub fn set_custom_genres(&mut self, custom_genres: impl IntoIterator<Item = String>) {
let data = custom_genres.into_iter().map(Data::Utf8);
self.set_all_data(ident::CUSTOM_GENRE, data);
}
pub fn set_custom_genre(&mut self, custom_genre: impl Into<String>) {
self.set_data(ident::CUSTOM_GENRE, Data::Utf8(custom_genre.into()));
}
pub fn add_custom_genres(&mut self, custom_genres: impl IntoIterator<Item = String>) {
let data = custom_genres.into_iter().map(Data::Utf8);
self.add_all_data(ident::CUSTOM_GENRE, data);
}
pub fn add_custom_genre(&mut self, custom_genre: impl Into<String>) {
self.add_data(ident::CUSTOM_GENRE, Data::Utf8(custom_genre.into()));
}
pub fn remove_custom_genres(&mut self) {
self.remove_data_of(&ident::CUSTOM_GENRE);
}
#[allow(unused)]
pub(crate) fn format_custom_genres(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.custom_genres().count() > 1 {
writeln!(f, "custom genres:")?;
for s in self.custom_genres() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.custom_genre() {
writeln!(f, "custom genre: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn descriptions(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::DESCRIPTION)
}
pub fn description(&self) -> Option<&str> {
self.strings_of(&ident::DESCRIPTION).next()
}
pub fn take_descriptions(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::DESCRIPTION)
}
pub fn take_description(&mut self) -> Option<String> {
self.take_strings_of(&ident::DESCRIPTION).next()
}
pub fn set_descriptions(&mut self, descriptions: impl IntoIterator<Item = String>) {
let data = descriptions.into_iter().map(Data::Utf8);
self.set_all_data(ident::DESCRIPTION, data);
}
pub fn set_description(&mut self, description: impl Into<String>) {
self.set_data(ident::DESCRIPTION, Data::Utf8(description.into()));
}
pub fn add_descriptions(&mut self, descriptions: impl IntoIterator<Item = String>) {
let data = descriptions.into_iter().map(Data::Utf8);
self.add_all_data(ident::DESCRIPTION, data);
}
pub fn add_description(&mut self, description: impl Into<String>) {
self.add_data(ident::DESCRIPTION, Data::Utf8(description.into()));
}
pub fn remove_descriptions(&mut self) {
self.remove_data_of(&ident::DESCRIPTION);
}
#[allow(unused)]
pub(crate) fn format_descriptions(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.descriptions().count() > 1 {
writeln!(f, "descriptions:")?;
for s in self.descriptions() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.description() {
writeln!(f, "description: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn groupings(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::GROUPING)
}
pub fn grouping(&self) -> Option<&str> {
self.strings_of(&ident::GROUPING).next()
}
pub fn take_groupings(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::GROUPING)
}
pub fn take_grouping(&mut self) -> Option<String> {
self.take_strings_of(&ident::GROUPING).next()
}
pub fn set_groupings(&mut self, groupings: impl IntoIterator<Item = String>) {
let data = groupings.into_iter().map(Data::Utf8);
self.set_all_data(ident::GROUPING, data);
}
pub fn set_grouping(&mut self, grouping: impl Into<String>) {
self.set_data(ident::GROUPING, Data::Utf8(grouping.into()));
}
pub fn add_groupings(&mut self, groupings: impl IntoIterator<Item = String>) {
let data = groupings.into_iter().map(Data::Utf8);
self.add_all_data(ident::GROUPING, data);
}
pub fn add_grouping(&mut self, grouping: impl Into<String>) {
self.add_data(ident::GROUPING, Data::Utf8(grouping.into()));
}
pub fn remove_groupings(&mut self) {
self.remove_data_of(&ident::GROUPING);
}
#[allow(unused)]
pub(crate) fn format_groupings(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.groupings().count() > 1 {
writeln!(f, "groupings:")?;
for s in self.groupings() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.grouping() {
writeln!(f, "grouping: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn keywords(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::KEYWORD)
}
pub fn keyword(&self) -> Option<&str> {
self.strings_of(&ident::KEYWORD).next()
}
pub fn take_keywords(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::KEYWORD)
}
pub fn take_keyword(&mut self) -> Option<String> {
self.take_strings_of(&ident::KEYWORD).next()
}
pub fn set_keywords(&mut self, keywords: impl IntoIterator<Item = String>) {
let data = keywords.into_iter().map(Data::Utf8);
self.set_all_data(ident::KEYWORD, data);
}
pub fn set_keyword(&mut self, keyword: impl Into<String>) {
self.set_data(ident::KEYWORD, Data::Utf8(keyword.into()));
}
pub fn add_keywords(&mut self, keywords: impl IntoIterator<Item = String>) {
let data = keywords.into_iter().map(Data::Utf8);
self.add_all_data(ident::KEYWORD, data);
}
pub fn add_keyword(&mut self, keyword: impl Into<String>) {
self.add_data(ident::KEYWORD, Data::Utf8(keyword.into()));
}
pub fn remove_keywords(&mut self) {
self.remove_data_of(&ident::KEYWORD);
}
#[allow(unused)]
pub(crate) fn format_keywords(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.keywords().count() > 1 {
writeln!(f, "keywords:")?;
for s in self.keywords() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.keyword() {
writeln!(f, "keyword: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn lyricists(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::LYRICIST)
}
pub fn lyricist(&self) -> Option<&str> {
self.strings_of(&ident::LYRICIST).next()
}
pub fn take_lyricists(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::LYRICIST)
}
pub fn take_lyricist(&mut self) -> Option<String> {
self.take_strings_of(&ident::LYRICIST).next()
}
pub fn set_lyricists(&mut self, lyricists: impl IntoIterator<Item = String>) {
let data = lyricists.into_iter().map(Data::Utf8);
self.set_all_data(ident::LYRICIST, data);
}
pub fn set_lyricist(&mut self, lyricist: impl Into<String>) {
self.set_data(ident::LYRICIST, Data::Utf8(lyricist.into()));
}
pub fn add_lyricists(&mut self, lyricists: impl IntoIterator<Item = String>) {
let data = lyricists.into_iter().map(Data::Utf8);
self.add_all_data(ident::LYRICIST, data);
}
pub fn add_lyricist(&mut self, lyricist: impl Into<String>) {
self.add_data(ident::LYRICIST, Data::Utf8(lyricist.into()));
}
pub fn remove_lyricists(&mut self) {
self.remove_data_of(&ident::LYRICIST);
}
#[allow(unused)]
pub(crate) fn format_lyricists(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.lyricists().count() > 1 {
writeln!(f, "lyricists:")?;
for s in self.lyricists() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.lyricist() {
writeln!(f, "lyricist: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn album_artist_sort_orders(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::ALBUM_ARTIST_SORT_ORDER)
}
pub fn album_artist_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::ALBUM_ARTIST_SORT_ORDER).next()
}
pub fn take_album_artist_sort_orders(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::ALBUM_ARTIST_SORT_ORDER)
}
pub fn take_album_artist_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::ALBUM_ARTIST_SORT_ORDER).next()
}
pub fn set_album_artist_sort_orders(&mut self, album_artist_sort_orders: impl IntoIterator<Item = String>) {
let data = album_artist_sort_orders.into_iter().map(Data::Utf8);
self.set_all_data(ident::ALBUM_ARTIST_SORT_ORDER, data);
}
pub fn set_album_artist_sort_order(&mut self, album_artist_sort_order: impl Into<String>) {
self.set_data(ident::ALBUM_ARTIST_SORT_ORDER, Data::Utf8(album_artist_sort_order.into()));
}
pub fn add_album_artist_sort_orders(&mut self, album_artist_sort_orders: impl IntoIterator<Item = String>) {
let data = album_artist_sort_orders.into_iter().map(Data::Utf8);
self.add_all_data(ident::ALBUM_ARTIST_SORT_ORDER, data);
}
pub fn add_album_artist_sort_order(&mut self, album_artist_sort_order: impl Into<String>) {
self.add_data(ident::ALBUM_ARTIST_SORT_ORDER, Data::Utf8(album_artist_sort_order.into()));
}
pub fn remove_album_artist_sort_orders(&mut self) {
self.remove_data_of(&ident::ALBUM_ARTIST_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_album_artist_sort_orders(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.album_artist_sort_orders().count() > 1 {
writeln!(f, "album artist sort orders:")?;
for s in self.album_artist_sort_orders() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.album_artist_sort_order() {
writeln!(f, "album artist sort order: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn artist_sort_orders(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::ARTIST_SORT_ORDER)
}
pub fn artist_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::ARTIST_SORT_ORDER).next()
}
pub fn take_artist_sort_orders(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::ARTIST_SORT_ORDER)
}
pub fn take_artist_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::ARTIST_SORT_ORDER).next()
}
pub fn set_artist_sort_orders(&mut self, artist_sort_orders: impl IntoIterator<Item = String>) {
let data = artist_sort_orders.into_iter().map(Data::Utf8);
self.set_all_data(ident::ARTIST_SORT_ORDER, data);
}
pub fn set_artist_sort_order(&mut self, artist_sort_order: impl Into<String>) {
self.set_data(ident::ARTIST_SORT_ORDER, Data::Utf8(artist_sort_order.into()));
}
pub fn add_artist_sort_orders(&mut self, artist_sort_orders: impl IntoIterator<Item = String>) {
let data = artist_sort_orders.into_iter().map(Data::Utf8);
self.add_all_data(ident::ARTIST_SORT_ORDER, data);
}
pub fn add_artist_sort_order(&mut self, artist_sort_order: impl Into<String>) {
self.add_data(ident::ARTIST_SORT_ORDER, Data::Utf8(artist_sort_order.into()));
}
pub fn remove_artist_sort_orders(&mut self) {
self.remove_data_of(&ident::ARTIST_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_artist_sort_orders(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.artist_sort_orders().count() > 1 {
writeln!(f, "artist sort orders:")?;
for s in self.artist_sort_orders() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.artist_sort_order() {
writeln!(f, "artist sort order: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn composer_sort_orders(&self) -> impl Iterator<Item=&str> {
self.strings_of(&ident::COMPOSER_SORT_ORDER)
}
pub fn composer_sort_order(&self) -> Option<&str> {
self.strings_of(&ident::COMPOSER_SORT_ORDER).next()
}
pub fn take_composer_sort_orders(&mut self) -> impl Iterator<Item=String> + '_ {
self.take_strings_of(&ident::COMPOSER_SORT_ORDER)
}
pub fn take_composer_sort_order(&mut self) -> Option<String> {
self.take_strings_of(&ident::COMPOSER_SORT_ORDER).next()
}
pub fn set_composer_sort_orders(&mut self, composer_sort_orders: impl IntoIterator<Item = String>) {
let data = composer_sort_orders.into_iter().map(Data::Utf8);
self.set_all_data(ident::COMPOSER_SORT_ORDER, data);
}
pub fn set_composer_sort_order(&mut self, composer_sort_order: impl Into<String>) {
self.set_data(ident::COMPOSER_SORT_ORDER, Data::Utf8(composer_sort_order.into()));
}
pub fn add_composer_sort_orders(&mut self, composer_sort_orders: impl IntoIterator<Item = String>) {
let data = composer_sort_orders.into_iter().map(Data::Utf8);
self.add_all_data(ident::COMPOSER_SORT_ORDER, data);
}
pub fn add_composer_sort_order(&mut self, composer_sort_order: impl Into<String>) {
self.add_data(ident::COMPOSER_SORT_ORDER, Data::Utf8(composer_sort_order.into()));
}
pub fn remove_composer_sort_orders(&mut self) {
self.remove_data_of(&ident::COMPOSER_SORT_ORDER);
}
#[allow(unused)]
pub(crate) fn format_composer_sort_orders(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.composer_sort_orders().count() > 1 {
writeln!(f, "composer sort orders:")?;
for s in self.composer_sort_orders() {
writeln!(f, " {}", s)?;
}
} else if let Some(s) = self.composer_sort_order() {
writeln!(f, "composer sort order: {}", s)?;
}
Ok(())
}
}
impl Userdata {
pub fn compilation(&self) -> bool {
let vec = match self.bytes_of(&ident::COMPILATION).next() {
Some(v) => v,
None => return false,
};
vec.first().map(|&v| v == 1).unwrap_or(false)
}
pub fn set_compilation(&mut self) {
self.set_data(ident::COMPILATION, Data::BeSigned(vec![1]));
}
pub fn remove_compilation(&mut self) {
self.remove_data_of(&ident::COMPILATION)
}
#[allow(unused)]
pub(crate) fn format_compilation(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.compilation() {
true => writeln!(f, "compilation"),
false => Ok(()),
}
}
}
impl Userdata {
pub fn gapless_playback(&self) -> bool {
let vec = match self.bytes_of(&ident::GAPLESS_PLAYBACK).next() {
Some(v) => v,
None => return false,
};
vec.first().map(|&v| v == 1).unwrap_or(false)
}
pub fn set_gapless_playback(&mut self) {
self.set_data(ident::GAPLESS_PLAYBACK, Data::BeSigned(vec![1]));
}
pub fn remove_gapless_playback(&mut self) {
self.remove_data_of(&ident::GAPLESS_PLAYBACK)
}
#[allow(unused)]
pub(crate) fn format_gapless_playback(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.gapless_playback() {
true => writeln!(f, "gapless playback"),
false => Ok(()),
}
}
}
impl Userdata {
pub fn show_movement(&self) -> bool {
let vec = match self.bytes_of(&ident::SHOW_MOVEMENT).next() {
Some(v) => v,
None => return false,
};
vec.first().map(|&v| v == 1).unwrap_or(false)
}
pub fn set_show_movement(&mut self) {
self.set_data(ident::SHOW_MOVEMENT, Data::BeSigned(vec![1]));
}
pub fn remove_show_movement(&mut self) {
self.remove_data_of(&ident::SHOW_MOVEMENT)
}
#[allow(unused)]
pub(crate) fn format_show_movement(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.show_movement() {
true => writeln!(f, "show movement"),
false => Ok(()),
}
}
}
impl Userdata {
pub fn bpm(&self) -> Option<u16> {
let vec = self.bytes_of(&ident::BPM).next()?;
be_int!(vec, 0, u16)
}
pub fn set_bpm(&mut self, bpm: u16) {
let vec: Vec<u8> = bpm.to_be_bytes().to_vec();
self.set_data(ident::BPM, Data::BeSigned(vec));
}
pub fn remove_bpm(&mut self) {
self.remove_data_of(&ident::BPM);
}
#[allow(unused)]
pub(crate) fn format_bpm(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.bpm() {
Some(s) => writeln!(f, "bpm: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn movement_count(&self) -> Option<u16> {
let vec = self.bytes_of(&ident::MOVEMENT_COUNT).next()?;
be_int!(vec, 0, u16)
}
pub fn set_movement_count(&mut self, movement_count: u16) {
let vec: Vec<u8> = movement_count.to_be_bytes().to_vec();
self.set_data(ident::MOVEMENT_COUNT, Data::BeSigned(vec));
}
pub fn remove_movement_count(&mut self) {
self.remove_data_of(&ident::MOVEMENT_COUNT);
}
#[allow(unused)]
pub(crate) fn format_movement_count(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.movement_count() {
Some(s) => writeln!(f, "movement count: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn movement_index(&self) -> Option<u16> {
let vec = self.bytes_of(&ident::MOVEMENT_INDEX).next()?;
be_int!(vec, 0, u16)
}
pub fn set_movement_index(&mut self, movement_index: u16) {
let vec: Vec<u8> = movement_index.to_be_bytes().to_vec();
self.set_data(ident::MOVEMENT_INDEX, Data::BeSigned(vec));
}
pub fn remove_movement_index(&mut self) {
self.remove_data_of(&ident::MOVEMENT_INDEX);
}
#[allow(unused)]
pub(crate) fn format_movement_index(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.movement_index() {
Some(s) => writeln!(f, "movement index: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_episode(&self) -> Option<u32> {
let vec = self.bytes_of(&ident::TV_EPISODE).next()?;
be_int!(vec, 0, u32)
}
pub fn set_tv_episode(&mut self, tv_episode: u32) {
let vec: Vec<u8> = tv_episode.to_be_bytes().to_vec();
self.set_data(ident::TV_EPISODE, Data::BeSigned(vec));
}
pub fn remove_tv_episode(&mut self) {
self.remove_data_of(&ident::TV_EPISODE);
}
#[allow(unused)]
pub(crate) fn format_tv_episode(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_episode() {
Some(s) => writeln!(f, "tv episode: {}", s),
None => Ok(()),
}
}
}
impl Userdata {
pub fn tv_season(&self) -> Option<u32> {
let vec = self.bytes_of(&ident::TV_SEASON).next()?;
be_int!(vec, 0, u32)
}
pub fn set_tv_season(&mut self, tv_season: u32) {
let vec: Vec<u8> = tv_season.to_be_bytes().to_vec();
self.set_data(ident::TV_SEASON, Data::BeSigned(vec));
}
pub fn remove_tv_season(&mut self) {
self.remove_data_of(&ident::TV_SEASON);
}
#[allow(unused)]
pub(crate) fn format_tv_season(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.tv_season() {
Some(s) => writeln!(f, "tv season: {}", s),
None => Ok(()),
}
}
}