Switch to new derive proc macro

This commit is contained in:
Serial 2021-07-19 12:51:08 -04:00
parent 7419e49891
commit c8f6a0ebc2
9 changed files with 86 additions and 41 deletions

View file

@ -29,7 +29,7 @@ base64 = "0.13.0"
byteorder = "1.4.3"
cfg-if = "1.0.0"
lofty_attr = "0.1.7"
lofty_attr = "0.1.8"
[features]
default = ["all_tags"]

View file

@ -6,7 +6,7 @@ use crate::{
use std::fs::File;
use std::io::{Read, Seek};
use lofty_attr::impl_tag;
use lofty_attr::LoftyTag;
#[derive(Default)]
struct AiffInnerTag {
@ -15,8 +15,13 @@ struct AiffInnerTag {
copyright_id: Option<String>,
}
#[impl_tag(AiffInnerTag, TagType::AiffText)]
pub struct AiffTag;
#[derive(LoftyTag)]
/// Represents Aiff Text Chunks
pub struct AiffTag {
inner: AiffInnerTag,
#[expected(TagType::AiffText)]
_format: TagType,
}
impl AiffTag {
#[allow(missing_docs)]
@ -33,6 +38,7 @@ impl AiffTag {
author_id,
copyright_id,
},
_format: TagType::AiffText,
})
}
}

View file

@ -9,10 +9,15 @@ use std::io::{Read, Seek};
use ape::Item;
pub use ape::Tag as ApeInnerTag;
use lofty_attr::{get_set_methods, impl_tag};
use lofty_attr::{get_set_methods, LoftyTag};
#[impl_tag(ApeInnerTag, TagType::Ape)]
pub struct ApeTag;
#[derive(LoftyTag)]
/// Represents an APEv2 tag
pub struct ApeTag {
inner: ApeInnerTag,
#[expected(TagType::Ape)]
_format: TagType,
}
impl ApeTag {
#[allow(missing_docs)]
@ -23,6 +28,7 @@ impl ApeTag {
{
Ok(Self {
inner: ape::read_from(reader)?,
_format: TagType::Ape,
})
}
}

View file

@ -11,27 +11,35 @@ use std::io::{Read, Seek, SeekFrom};
use filepath::FilePath;
pub use id3::Tag as Id3v2InnerTag;
use lofty_attr::impl_tag;
use lofty_attr::LoftyTag;
#[impl_tag(Id3v2InnerTag, TagType::Id3v2(Id3Format::Mp3))]
pub struct Id3v2Tag;
#[derive(LoftyTag)]
/// Represents an ID3 tag
pub struct Id3v2Tag {
inner: Id3v2InnerTag,
#[expected(TagType::Id3v2(Id3Format::Mp3))]
_format: TagType,
}
impl Id3v2Tag {
#[allow(missing_docs)]
#[allow(clippy::missing_errors_doc)]
pub fn read_from<R>(reader: &mut R, format: &Id3Format) -> Result<Self>
pub fn read_from<R>(reader: &mut R, format: Id3Format) -> Result<Self>
where
R: Read + Seek,
{
match format {
Id3Format::Mp3 => Ok(Self {
inner: Id3v2InnerTag::read_from(reader)?,
_format: TagType::Id3v2(format),
}),
Id3Format::Riff => Ok(Self {
inner: Id3v2InnerTag::read_from_wav_reader(reader)?,
_format: TagType::Id3v2(format),
}),
Id3Format::Aiff => Ok(Self {
inner: Id3v2InnerTag::read_from_aiff_reader(reader)?,
_format: TagType::Id3v2(format),
}),
}
}
@ -370,9 +378,7 @@ impl AudioTagEdit for Id3v2Tag {
}
fn tag_type(&self) -> TagType {
// Unsure how to get the Id3Format back
// Shouldn't matter much for ID3 though
TagType::Id3v2(Id3Format::Mp3)
self._format.clone()
}
fn get_key(&self, key: &str) -> Option<&str> {

View file

@ -7,11 +7,16 @@ use std::borrow::Cow;
use std::fs::File;
use std::io::{Read, Seek};
use lofty_attr::impl_tag;
use lofty_attr::LoftyTag;
pub use mp4ameta::{Fourcc, Tag as Mp4InnerTag};
#[impl_tag(Mp4InnerTag, TagType::Mp4)]
pub struct Mp4Tag {}
#[derive(LoftyTag)]
/// Represents an MPEG-4 tag
pub struct Mp4Tag {
inner: Mp4InnerTag,
#[expected(TagType::Mp4)]
_format: TagType,
}
impl Mp4Tag {
#[allow(missing_docs)]
@ -22,6 +27,7 @@ impl Mp4Tag {
{
Ok(Self {
inner: Mp4InnerTag::read_from(reader)?,
_format: TagType::Mp4,
})
}
}

View file

@ -20,14 +20,13 @@ use std::convert::{TryFrom, TryInto};
use std::fs::File;
use std::io::{Read, Seek, SeekFrom};
use lofty_attr::{get_set_methods, impl_tag};
use lofty_attr::{get_set_methods, LoftyTag};
use unicase::UniCase;
struct OggInnerTag {
vendor: String,
comments: HashMap<UniCase<String>, String>,
pictures: Option<Cow<'static, [Picture]>>,
format: Option<OggFormat>,
}
impl Default for OggInnerTag {
@ -36,7 +35,6 @@ impl Default for OggInnerTag {
vendor: String::new(),
comments: HashMap::default(),
pictures: None,
format: None,
}
}
}
@ -79,14 +77,29 @@ impl OggInnerTag {
cfg_if::cfg_if! {
if #[cfg(feature = "format-opus")] {
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Opus))]
pub struct OggTag;
#[derive(LoftyTag)]
/// Represents vorbis comments from multiple OGG formats
pub struct OggTag {
inner: OggInnerTag,
#[expected(TagType::Ogg(OggFormat::Opus))]
_format: TagType,
}
} else if #[cfg(feature = "format-vorbis")] {
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Vorbis))]
pub struct OggTag;
#[derive(LoftyTag)]
/// Represents vorbis comments from multiple OGG formats
pub struct OggTag {
inner: OggInnerTag,
#[expected(TagType::Ogg(OggFormat::Vorbis))]
_format: TagType,
}
} else {
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Flac))]
pub struct OggTag;
#[derive(LoftyTag)]
/// Represents vorbis comments from multiple OGG formats
pub struct OggTag {
inner: OggInnerTag,
#[expected(TagType::Ogg(OggFormat::Flac))]
_format: TagType,
}
}
}
@ -95,17 +108,18 @@ impl TryFrom<OGGTags> for OggTag {
type Error = LoftyError;
fn try_from(inp: OGGTags) -> Result<Self> {
let mut tag = Self::default();
let mut tag = Self::new();
let vendor = inp.0;
let pictures = inp.1;
let comments = inp.2;
tag._format = TagType::Ogg(inp.3);
tag.inner = OggInnerTag {
vendor,
comments,
pictures: (!pictures.is_empty()).then(|| Cow::from(pictures)),
format: Some(inp.3),
};
Ok(tag)
@ -117,7 +131,7 @@ impl TryFrom<metaflac::Tag> for OggTag {
type Error = LoftyError;
fn try_from(inp: metaflac::Tag) -> Result<Self> {
let mut tag = Self::default();
let mut tag = Self::new();
if let Some(comments) = inp.vorbis_comments() {
let mut user_comments = comments.comments.clone();
@ -140,11 +154,12 @@ impl TryFrom<metaflac::Tag> for OggTag {
}
}
tag._format = TagType::Ogg(OggFormat::Flac);
tag.inner = OggInnerTag {
vendor: comments.vendor_string.clone(),
comments: comment_collection,
pictures: Some(Cow::from(pictures)),
format: Some(OggFormat::Flac),
};
return Ok(tag);
@ -159,12 +174,13 @@ impl TryFrom<metaflac::Tag> for OggTag {
impl OggTag {
#[allow(missing_docs)]
#[allow(clippy::missing_errors_doc)]
pub fn read_from<R>(reader: &mut R, format: &OggFormat) -> Result<Self>
pub fn read_from<R>(reader: &mut R, format: OggFormat) -> Result<Self>
where
R: Read + Seek,
{
Ok(Self {
inner: OggInnerTag::read_from(reader, format)?,
inner: OggInnerTag::read_from(reader, &format)?,
_format: TagType::Ogg(format),
})
}
@ -369,9 +385,7 @@ impl AudioTagEdit for OggTag {
}
fn tag_type(&self) -> TagType {
// A format is added when the OggTag is created, and it is **never** None.
// This is safe to unwrap
TagType::Ogg(self.inner.format.clone().unwrap())
self._format.clone()
}
fn get_key(&self, key: &str) -> Option<&str> {

View file

@ -7,7 +7,7 @@ use std::collections::HashMap;
use std::fs::File;
use std::io::{Read, Seek};
use lofty_attr::{get_set_methods, impl_tag};
use lofty_attr::{get_set_methods, LoftyTag};
struct RiffInnerTag {
data: HashMap<String, String>,
@ -21,8 +21,13 @@ impl Default for RiffInnerTag {
}
}
#[impl_tag(RiffInnerTag, TagType::RiffInfo)]
pub struct RiffTag;
#[derive(LoftyTag)]
/// Represents a RIFF INFO LIST
pub struct RiffTag {
inner: RiffInnerTag,
#[expected(TagType::RiffInfo)]
_format: TagType,
}
impl RiffTag {
#[allow(missing_docs)]
@ -35,6 +40,7 @@ impl RiffTag {
inner: RiffInnerTag {
data: riff::read_from(reader)?,
},
_format: TagType::RiffInfo,
})
}
}

View file

@ -120,7 +120,8 @@
clippy::doc_markdown,
clippy::let_underscore_drop,
clippy::match_wildcard_for_single_variants,
clippy::semicolon_if_nothing_returned
clippy::semicolon_if_nothing_returned,
clippy::used_underscore_binding
)]
mod types;

View file

@ -97,7 +97,7 @@ impl Tag {
#[cfg(feature = "format-ape")]
TagType::Ape => Ok(Box::new(ApeTag::read_from(reader)?)),
#[cfg(feature = "format-id3")]
TagType::Id3v2(format) => Ok(Box::new(Id3v2Tag::read_from(reader, &format)?)),
TagType::Id3v2(format) => Ok(Box::new(Id3v2Tag::read_from(reader, format)?)),
#[cfg(feature = "format-mp4")]
TagType::Mp4 => Ok(Box::new(Mp4Tag::read_from(reader)?)),
#[cfg(feature = "format-riff")]
@ -107,7 +107,7 @@ impl Tag {
feature = "format-flac",
feature = "format-opus"
))]
TagType::Ogg(format) => Ok(Box::new(OggTag::read_from(reader, &format)?)),
TagType::Ogg(format) => Ok(Box::new(OggTag::read_from(reader, format)?)),
#[cfg(feature = "format-aiff")]
TagType::AiffText => Ok(Box::new(AiffTag::read_from(reader)?)),
}