diff --git a/examples/custom_resolver/src/main.rs b/examples/custom_resolver/src/main.rs index fdd18a5d7..1ac3b3e4a 100644 --- a/examples/custom_resolver/src/main.rs +++ b/examples/custom_resolver/src/main.rs @@ -1,9 +1,10 @@ use lofty::ape::ApeTag; +use lofty::config::{GlobalOptions, ParseOptions}; use lofty::error::Result as LoftyResult; use lofty::id3::v2::Id3v2Tag; use lofty::properties::FileProperties; use lofty::resolve::FileResolver; -use lofty::{FileType, GlobalOptions, ParseOptions, TagType}; +use lofty::{FileType, TagType}; use lofty_attr::LoftyFile; use std::fs::File; @@ -95,7 +96,7 @@ fn main() { // By default, lofty will not check for custom files. // We can enable this by updating our `GlobalOptions`. let global_options = GlobalOptions::new().use_custom_resolvers(true); - lofty::apply_global_options(global_options); + lofty::config::apply_global_options(global_options); // Now when using the following functions, your custom file will be checked diff --git a/examples/tag_reader.rs b/examples/tag_reader.rs index 96bfb369f..4849529a0 100644 --- a/examples/tag_reader.rs +++ b/examples/tag_reader.rs @@ -1,5 +1,5 @@ use lofty::prelude::*; -use lofty::{Probe, TaggedFileExt}; +use lofty::Probe; use std::path::Path; diff --git a/examples/tag_writer.rs b/examples/tag_writer.rs index 9a08844b3..745283e18 100644 --- a/examples/tag_writer.rs +++ b/examples/tag_writer.rs @@ -1,5 +1,6 @@ +use lofty::config::WriteOptions; use lofty::prelude::*; -use lofty::{Probe, Tag, TaggedFileExt, WriteOptions}; +use lofty::{Probe, Tag}; use structopt::StructOpt; diff --git a/lofty_attr/src/internal.rs b/lofty_attr/src/internal.rs index d0f9aaf5e..e46158f7a 100644 --- a/lofty_attr/src/internal.rs +++ b/lofty_attr/src/internal.rs @@ -111,7 +111,7 @@ pub(crate) fn write_module( quote! { pub(crate) mod write { #[allow(unused_variables)] - pub(crate) fn write_to(data: &mut ::std::fs::File, tag: &::lofty::Tag, write_options: ::lofty::WriteOptions) -> ::lofty::error::Result<()> { + pub(crate) fn write_to(data: &mut ::std::fs::File, tag: &::lofty::Tag, write_options: ::lofty::config::WriteOptions) -> ::lofty::error::Result<()> { match tag.tag_type() { #( #applicable_formats )* _ => crate::macros::err!(UnsupportedTag), diff --git a/lofty_attr/src/lofty_file.rs b/lofty_attr/src/lofty_file.rs index 50bf7d039..df78837ac 100644 --- a/lofty_attr/src/lofty_file.rs +++ b/lofty_attr/src/lofty_file.rs @@ -438,14 +438,14 @@ fn generate_audiofile_impl(file: &LoftyFile) -> syn::Result(reader: &mut R, parse_options: ::lofty::ParseOptions) -> ::lofty::error::Result + fn read_from(reader: &mut R, parse_options: ::lofty::config::ParseOptions) -> ::lofty::error::Result where R: std::io::Read + std::io::Seek, { #read_fn(reader, parse_options) } - fn save_to(&self, file: &mut ::std::fs::File, write_options: ::lofty::WriteOptions) -> ::lofty::error::Result<()> { + fn save_to(&self, file: &mut ::std::fs::File, write_options: ::lofty::config::WriteOptions) -> ::lofty::error::Result<()> { use ::lofty::prelude::TagExt as _; use ::std::io::Seek as _; #save_to_body diff --git a/src/aac/header.rs b/src/aac/header.rs index 57c8765a2..5b456eb0b 100644 --- a/src/aac/header.rs +++ b/src/aac/header.rs @@ -1,8 +1,8 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::macros::decode_err; use crate::mp4::{AudioObjectType, SAMPLE_RATES}; use crate::mpeg::MpegVersion; -use crate::probe::ParsingMode; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/aac/read.rs b/src/aac/read.rs index 4194853da..43c04b75f 100644 --- a/src/aac/read.rs +++ b/src/aac/read.rs @@ -1,12 +1,12 @@ use super::header::{ADTSHeader, HEADER_MASK}; use super::AacFile; +use crate::config::{ParseOptions, ParsingMode}; use crate::error::Result; use crate::id3::v2::header::Id3v2Header; use crate::id3::v2::read::parse_id3v2; use crate::id3::{find_id3v1, ID3FindResults}; use crate::macros::{decode_err, parse_mode_choice}; use crate::mpeg::header::{cmp_header, search_for_frame_sync, HeaderCmpResult}; -use crate::probe::{ParseOptions, ParsingMode}; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/ape/properties.rs b/src/ape/properties.rs index 3fa509d02..3836bc750 100644 --- a/src/ape/properties.rs +++ b/src/ape/properties.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::macros::decode_err; -use crate::probe::ParsingMode; use crate::properties::FileProperties; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/ape/read.rs b/src/ape/read.rs index 02a1e2c81..4b01e996b 100644 --- a/src/ape/read.rs +++ b/src/ape/read.rs @@ -2,13 +2,13 @@ use super::header::read_ape_header; use super::tag::ApeTag; use super::{ApeFile, ApeProperties}; use crate::ape::tag::read::{read_ape_tag, read_ape_tag_with_header}; +use crate::config::ParseOptions; use crate::error::Result; use crate::id3::v1::tag::Id3v1Tag; use crate::id3::v2::read::parse_id3v2; use crate::id3::v2::tag::Id3v2Tag; use crate::id3::{find_id3v1, find_id3v2, find_lyrics3v2, FindId3v2Config, ID3FindResults}; use crate::macros::decode_err; -use crate::probe::ParseOptions; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/ape/tag/mod.rs b/src/ape/tag/mod.rs index e4a4e8a3e..b0056f812 100644 --- a/src/ape/tag/mod.rs +++ b/src/ape/tag/mod.rs @@ -3,12 +3,12 @@ pub(crate) mod read; mod write; use crate::ape::tag::item::{ApeItem, ApeItemRef}; +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::id3::v2::util::pairs::{format_number_pair, set_number, NUMBER_PAIR_KEYS}; use crate::tag::item::{ItemKey, ItemValue, ItemValueRef, TagItem}; use crate::tag::{try_parse_year, Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; @@ -544,9 +544,10 @@ pub(crate) fn tagitems_into_ape(tag: &Tag) -> impl Iterator &'static GlobalOptions { /// # Examples /// /// ```rust -/// use lofty::GlobalOptions; +/// use lofty::config::{apply_global_options, GlobalOptions}; /// /// // I have a custom resolver that I need checked /// let global_options = GlobalOptions::new().use_custom_resolvers(true); -/// lofty::apply_global_options(global_options); +/// apply_global_options(global_options); /// ``` #[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)] #[non_exhaustive] @@ -37,7 +37,7 @@ impl GlobalOptions { /// # Examples /// /// ```rust - /// use lofty::GlobalOptions; + /// use lofty::config::GlobalOptions; /// /// let global_options = GlobalOptions::new(); /// ``` @@ -56,11 +56,11 @@ impl GlobalOptions { /// # Examples /// /// ```rust - /// use lofty::GlobalOptions; + /// use lofty::config::{apply_global_options, GlobalOptions}; /// /// // By default, `use_custom_resolvers` is enabled. Here, we don't want to use them. /// let global_options = GlobalOptions::new().use_custom_resolvers(false); - /// lofty::apply_global_options(global_options); + /// apply_global_options(global_options); /// ``` pub fn use_custom_resolvers(&mut self, use_custom_resolvers: bool) -> Self { self.use_custom_resolvers = use_custom_resolvers; @@ -75,11 +75,11 @@ impl GlobalOptions { /// # Examples /// /// ```rust - /// use lofty::GlobalOptions; + /// use lofty::config::{apply_global_options, GlobalOptions}; /// /// // I have files with gigantic images, I'll double the allocation limit! /// let global_options = GlobalOptions::new().allocation_limit(32 * 1024 * 1024); - /// lofty::apply_global_options(global_options); + /// apply_global_options(global_options); /// ``` pub fn allocation_limit(&mut self, allocation_limit: usize) -> Self { self.allocation_limit = allocation_limit; @@ -108,11 +108,11 @@ impl Default for GlobalOptions { /// # Examples /// /// ```rust -/// use lofty::GlobalOptions; +/// use lofty::config::{apply_global_options, GlobalOptions}; /// /// // I have a custom resolver that I need checked /// let global_options = GlobalOptions::new().use_custom_resolvers(true); -/// lofty::apply_global_options(global_options); +/// apply_global_options(global_options); /// ``` pub fn apply_global_options(options: GlobalOptions) { GLOBAL_OPTIONS.with(|global_options| unsafe { diff --git a/src/config/mod.rs b/src/config/mod.rs new file mode 100644 index 000000000..3a998d2ad --- /dev/null +++ b/src/config/mod.rs @@ -0,0 +1,11 @@ +//! Various configuration options to control Lofty + +mod global_options; +mod parse_options; +mod write_options; + +pub use global_options::{apply_global_options, GlobalOptions}; +pub use parse_options::{ParseOptions, ParsingMode}; +pub use write_options::WriteOptions; + +pub(crate) use global_options::global_options; diff --git a/src/config/parse_options.rs b/src/config/parse_options.rs new file mode 100644 index 000000000..12a1857ac --- /dev/null +++ b/src/config/parse_options.rs @@ -0,0 +1,154 @@ +/// Options to control how Lofty parses a file +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[non_exhaustive] +pub struct ParseOptions { + pub(crate) read_properties: bool, + pub(crate) parsing_mode: ParsingMode, + pub(crate) max_junk_bytes: usize, +} + +impl Default for ParseOptions { + /// The default implementation for `ParseOptions` + /// + /// The defaults are as follows: + /// + /// ```rust,ignore + /// ParseOptions { + /// read_properties: true, + /// parsing_mode: ParsingMode::BestAttempt, + /// max_junk_bytes: 1024 + /// } + /// ``` + fn default() -> Self { + Self::new() + } +} + +impl ParseOptions { + /// Default parsing mode + pub const DEFAULT_PARSING_MODE: ParsingMode = ParsingMode::BestAttempt; + + /// Default number of junk bytes to read + pub const DEFAULT_MAX_JUNK_BYTES: usize = 1024; + + /// Creates a new `ParseOptions`, alias for `Default` implementation + /// + /// See also: [`ParseOptions::default`] + /// + /// # Examples + /// + /// ```rust + /// use lofty::config::ParseOptions; + /// + /// let parsing_options = ParseOptions::new(); + /// ``` + #[must_use] + pub const fn new() -> Self { + Self { + read_properties: true, + parsing_mode: Self::DEFAULT_PARSING_MODE, + max_junk_bytes: Self::DEFAULT_MAX_JUNK_BYTES, + } + } + + /// Whether or not to read the audio properties + /// + /// # Examples + /// + /// ```rust + /// use lofty::config::ParseOptions; + /// + /// // By default, `read_properties` is enabled. Here, we don't want to read them. + /// let parsing_options = ParseOptions::new().read_properties(false); + /// ``` + pub fn read_properties(&mut self, read_properties: bool) -> Self { + self.read_properties = read_properties; + *self + } + + /// The parsing mode to use, see [`ParsingMode`] for details + /// + /// # Examples + /// + /// ```rust + /// use lofty::config::{ParseOptions, ParsingMode}; + /// + /// // By default, `parsing_mode` is ParsingMode::BestAttempt. Here, we need absolute correctness. + /// let parsing_options = ParseOptions::new().parsing_mode(ParsingMode::Strict); + /// ``` + pub fn parsing_mode(&mut self, parsing_mode: ParsingMode) -> Self { + self.parsing_mode = parsing_mode; + *self + } + + /// The maximum number of allowed junk bytes to search + /// + /// Some information may be surrounded by junk bytes, such as tag padding remnants. This sets the maximum + /// number of junk/unrecognized bytes Lofty will search for required information before giving up. + /// + /// # Examples + /// + /// ```rust + /// use lofty::config::ParseOptions; + /// + /// // I have files full of junk, I'll double the search window! + /// let parsing_options = ParseOptions::new().max_junk_bytes(2048); + /// ``` + pub fn max_junk_bytes(&mut self, max_junk_bytes: usize) -> Self { + self.max_junk_bytes = max_junk_bytes; + *self + } +} + +/// The parsing strictness mode +/// +/// This can be set with [`Probe::options`]. +/// +/// # Examples +/// +/// ```rust,no_run +/// use lofty::config::{ParseOptions, ParsingMode}; +/// use lofty::Probe; +/// +/// # fn main() -> lofty::error::Result<()> { +/// // We only want to read spec-compliant inputs +/// let parsing_options = ParseOptions::new().parsing_mode(ParsingMode::Strict); +/// let tagged_file = Probe::open("foo.mp3")?.options(parsing_options).read()?; +/// # Ok(()) } +/// ``` +#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Default)] +#[non_exhaustive] +pub enum ParsingMode { + /// Will eagerly error on invalid input + /// + /// This mode will eagerly error on any non spec-compliant input. + /// + /// ## Examples of behavior + /// + /// * Unable to decode text - The parser will error and the entire input is discarded + /// * Unable to determine the sample rate - The parser will error and the entire input is discarded + Strict, + /// Default mode, less eager to error on recoverably malformed input + /// + /// This mode will attempt to fill in any holes where possible in otherwise valid, spec-compliant input. + /// + /// NOTE: A readable input does *not* necessarily make it writeable. + /// + /// ## Examples of behavior + /// + /// * Unable to decode text - If valid otherwise, the field will be replaced by an empty string and the parser moves on + /// * Unable to determine the sample rate - The sample rate will be 0 + #[default] + BestAttempt, + /// Least eager to error, may produce invalid/partial output + /// + /// This mode will discard any invalid fields, and ignore the majority of non-fatal errors. + /// + /// If the input is malformed, the resulting tags may be incomplete, and the properties zeroed. + /// + /// ## Examples of behavior + /// + /// * Unable to decode text - The entire item is discarded and the parser moves on + /// * Unable to determine the sample rate - The sample rate will be 0 + Relaxed, +} diff --git a/src/write_options.rs b/src/config/write_options.rs similarity index 89% rename from src/write_options.rs rename to src/config/write_options.rs index 2fbf2d628..de90df2c2 100644 --- a/src/write_options.rs +++ b/src/config/write_options.rs @@ -22,7 +22,7 @@ impl WriteOptions { /// # Examples /// /// ```rust - /// use lofty::WriteOptions; + /// use lofty::config::WriteOptions; /// /// let write_options = WriteOptions::new(); /// ``` @@ -48,7 +48,7 @@ impl WriteOptions { /// # Examples /// /// ```rust - /// use lofty::WriteOptions; + /// use lofty::config::WriteOptions; /// /// // I really don't want my files rewritten, so I'll double the padding size! /// let options = WriteOptions::new().preferred_padding(2048); @@ -71,9 +71,11 @@ impl WriteOptions { /// # Examples /// /// ```rust,no_run - /// use lofty::{Tag, TagExt, TagType, WriteOptions}; + /// use lofty::config::WriteOptions; + /// use lofty::prelude::*; + /// use lofty::{Tag, TagType}; /// - /// # fn main() -> lofty::Result<()> { + /// # fn main() -> lofty::error::Result<()> { /// let mut id3v2_tag = Tag::new(TagType::Id3v2); /// /// // ... @@ -99,9 +101,11 @@ impl WriteOptions { /// # Examples /// /// ```rust,no_run - /// use lofty::{Tag, TagExt, TagType, WriteOptions}; + /// use lofty::config::WriteOptions; + /// use lofty::prelude::*; + /// use lofty::{Tag, TagType}; /// - /// # fn main() -> lofty::Result<()> { + /// # fn main() -> lofty::error::Result<()> { /// let mut id3v2_tag = Tag::new(TagType::Id3v2); /// /// // ... @@ -127,9 +131,11 @@ impl WriteOptions { /// # Examples /// /// ```rust,no_run - /// use lofty::{Tag, TagExt, TagType, WriteOptions}; + /// use lofty::config::WriteOptions; + /// use lofty::prelude::*; + /// use lofty::{Tag, TagType}; /// - /// # fn main() -> lofty::Result<()> { + /// # fn main() -> lofty::error::Result<()> { /// let mut id3v2_tag = Tag::new(TagType::Id3v2); /// /// // ... diff --git a/src/file.rs b/src/file.rs index 859a0304b..fb6f70fd4 100644 --- a/src/file.rs +++ b/src/file.rs @@ -1,11 +1,9 @@ +use crate::config::{global_options, ParseOptions, WriteOptions}; use crate::error::Result; -use crate::global_options::global_options; -use crate::probe::ParseOptions; use crate::properties::FileProperties; use crate::resolve::custom_resolvers; use crate::tag::{Tag, TagType}; use crate::traits::TagExt; -use crate::write_options::WriteOptions; use std::ffi::OsStr; use std::fs::{File, OpenOptions}; diff --git a/src/flac/mod.rs b/src/flac/mod.rs index 46f21b988..4ff7642c8 100644 --- a/src/flac/mod.rs +++ b/src/flac/mod.rs @@ -9,6 +9,7 @@ pub(crate) mod properties; mod read; pub(crate) mod write; +use crate::config::WriteOptions; use crate::error::Result; use crate::file::{FileType, TaggedFile}; use crate::id3::v2::tag::Id3v2Tag; @@ -16,7 +17,6 @@ use crate::ogg::tag::VorbisCommentsRef; use crate::ogg::{OggPictureStorage, VorbisComments}; use crate::picture::{Picture, PictureInformation}; use crate::traits::TagExt; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::Seek; diff --git a/src/flac/read.rs b/src/flac/read.rs index 97282d851..db961d3a9 100644 --- a/src/flac/read.rs +++ b/src/flac/read.rs @@ -1,6 +1,7 @@ use super::block::Block; use super::properties::FlacProperties; use super::FlacFile; +use crate::config::{ParseOptions, ParsingMode}; use crate::error::Result; use crate::flac::block::{ BLOCK_ID_PADDING, BLOCK_ID_PICTURE, BLOCK_ID_SEEKTABLE, BLOCK_ID_STREAMINFO, @@ -11,7 +12,6 @@ use crate::id3::{find_id3v2, FindId3v2Config, ID3FindResults}; use crate::macros::decode_err; use crate::ogg::read::read_comments; use crate::picture::Picture; -use crate::probe::{ParseOptions, ParsingMode}; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/flac/write.rs b/src/flac/write.rs index 321e2d750..d043c53be 100644 --- a/src/flac/write.rs +++ b/src/flac/write.rs @@ -1,12 +1,12 @@ use super::block::Block; use super::read::verify_flac; +use crate::config::WriteOptions; use crate::error::Result; use crate::macros::{err, try_vec}; use crate::ogg::tag::VorbisCommentsRef; use crate::ogg::write::create_comments; use crate::picture::{Picture, PictureInformation}; use crate::tag::{Tag, TagType}; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; diff --git a/src/id3/v1/tag.rs b/src/id3/v1/tag.rs index 6dbae3925..84f88f08f 100644 --- a/src/id3/v1/tag.rs +++ b/src/id3/v1/tag.rs @@ -1,9 +1,9 @@ +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::id3::v1::constants::GENRES; use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; @@ -440,9 +440,10 @@ impl<'a> Id3v1TagRef<'a> { #[cfg(test)] mod tests { + use crate::config::WriteOptions; use crate::id3::v1::Id3v1Tag; use crate::prelude::*; - use crate::{Tag, TagType, WriteOptions}; + use crate::{Tag, TagType}; #[test] fn parse_id3v1() { diff --git a/src/id3/v1/write.rs b/src/id3/v1/write.rs index 0efd21d2d..188ea3b24 100644 --- a/src/id3/v1/write.rs +++ b/src/id3/v1/write.rs @@ -1,9 +1,9 @@ use super::tag::Id3v1TagRef; +use crate::config::WriteOptions; use crate::error::Result; use crate::id3::{find_id3v1, ID3FindResults}; use crate::macros::err; use crate::probe::Probe; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Cursor, Seek, Write}; diff --git a/src/id3/v2/frame/content.rs b/src/id3/v2/frame/content.rs index e7607356f..6c8d84ead 100644 --- a/src/id3/v2/frame/content.rs +++ b/src/id3/v2/frame/content.rs @@ -1,3 +1,4 @@ +use crate::config::ParsingMode; use crate::error::{Id3v2Error, Id3v2ErrorKind, Result}; use crate::id3::v2::frame::FrameValue; use crate::id3::v2::header::Id3v2Version; @@ -7,7 +8,6 @@ use crate::id3::v2::items::{ TextInformationFrame, UniqueFileIdentifierFrame, UnsynchronizedTextFrame, UrlLinkFrame, }; use crate::macros::err; -use crate::probe::ParsingMode; use crate::util::text::TextEncoding; use std::io::Read; diff --git a/src/id3/v2/frame/read.rs b/src/id3/v2/frame/read.rs index b0b570958..8ba2aa128 100644 --- a/src/id3/v2/frame/read.rs +++ b/src/id3/v2/frame/read.rs @@ -1,12 +1,12 @@ use super::header::{parse_header, parse_v2_header}; use super::Frame; +use crate::config::ParsingMode; use crate::error::{Id3v2Error, Id3v2ErrorKind, Result}; use crate::id3::v2::frame::content::parse_content; use crate::id3::v2::header::Id3v2Version; use crate::id3::v2::util::synchsafe::{SynchsafeInteger, UnsynchronizedStream}; use crate::id3::v2::{FrameFlags, FrameId, FrameValue}; use crate::macros::try_vec; -use crate::probe::ParsingMode; use std::io::Read; diff --git a/src/id3/v2/items/relative_volume_adjustment_frame.rs b/src/id3/v2/items/relative_volume_adjustment_frame.rs index 9aa8c10dc..effbd17db 100644 --- a/src/id3/v2/items/relative_volume_adjustment_frame.rs +++ b/src/id3/v2/items/relative_volume_adjustment_frame.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::{Id3v2Error, Id3v2ErrorKind, Result}; use crate::macros::try_vec; -use crate::probe::ParsingMode; use crate::util::text::{decode_text, encode_text, TextDecodeOptions, TextEncoding}; use std::collections::HashMap; @@ -202,8 +202,8 @@ impl RelativeVolumeAdjustmentFrame { #[cfg(test)] mod tests { + use crate::config::ParsingMode; use crate::id3::v2::{ChannelInformation, ChannelType, RelativeVolumeAdjustmentFrame}; - use crate::ParsingMode; use std::collections::HashMap; use std::io::Read; diff --git a/src/id3/v2/items/unique_file_identifier.rs b/src/id3/v2/items/unique_file_identifier.rs index ca3a75d0c..cb373d43d 100644 --- a/src/id3/v2/items/unique_file_identifier.rs +++ b/src/id3/v2/items/unique_file_identifier.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::{Id3v2Error, Id3v2ErrorKind, Result}; use crate::macros::parse_mode_choice; -use crate::probe::ParsingMode; use crate::util::text::{decode_text, encode_text, TextDecodeOptions, TextEncoding}; use std::hash::{Hash, Hasher}; @@ -78,8 +78,8 @@ impl Hash for UniqueFileIdentifierFrame { mod tests { #[test] fn issue_204_invalid_ufid_parsing_mode_best_attempt() { + use crate::config::ParsingMode; use crate::id3::v2::UniqueFileIdentifierFrame; - use crate::ParsingMode; let ufid_no_owner = UniqueFileIdentifierFrame { owner: String::new(), diff --git a/src/id3/v2/read.rs b/src/id3/v2/read.rs index 622b8ed7b..d0775301a 100644 --- a/src/id3/v2/read.rs +++ b/src/id3/v2/read.rs @@ -1,9 +1,9 @@ use super::frame::read::ParsedFrame; use super::header::Id3v2Header; use super::tag::Id3v2Tag; +use crate::config::ParsingMode; use crate::error::{Id3v2Error, Id3v2ErrorKind, Result}; use crate::id3::v2::util::synchsafe::UnsynchronizedStream; -use crate::probe::ParsingMode; use std::io::Read; @@ -104,8 +104,9 @@ where #[test] fn zero_size_id3v2() { + use crate::config::ParsingMode; use crate::id3::v2::header::Id3v2Header; - use crate::ParsingMode; + use std::io::Cursor; let mut f = Cursor::new(std::fs::read("tests/tags/assets/id3v2/zero.id3v2").unwrap()); @@ -115,9 +116,9 @@ fn zero_size_id3v2() { #[test] fn bad_frame_id_relaxed_id3v2() { + use crate::config::ParsingMode; use crate::id3::v2::header::Id3v2Header; use crate::prelude::*; - use crate::ParsingMode; use std::io::Cursor; diff --git a/src/id3/v2/tag.rs b/src/id3/v2/tag.rs index 144e3c022..81feae692 100644 --- a/src/id3/v2/tag.rs +++ b/src/id3/v2/tag.rs @@ -4,6 +4,7 @@ mod tests; use super::frame::id::FrameId; use super::frame::{Frame, FrameFlags, FrameValue, EMPTY_CONTENT_DESCRIPTOR, UNKNOWN_LANGUAGE}; use super::header::{Id3v2TagFlags, Id3v2Version}; +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::id3::v1::GENRES; use crate::id3::v2::frame::{FrameRef, MUSICBRAINZ_UFID_OWNER}; @@ -21,7 +22,6 @@ use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{try_parse_year, Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; use crate::util::text::{decode_text, TextDecodeOptions, TextEncoding}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; diff --git a/src/id3/v2/tag/tests.rs b/src/id3/v2/tag/tests.rs index 12183e8f4..940a7f5df 100644 --- a/src/id3/v2/tag/tests.rs +++ b/src/id3/v2/tag/tests.rs @@ -1,8 +1,8 @@ +use crate::config::ParsingMode; use crate::id3::v2::header::Id3v2Header; use crate::id3::v2::items::Popularimeter; use crate::id3::v2::util::pairs::DEFAULT_NUMBER_IN_PAIR; use crate::picture::MimeType; -use crate::probe::ParsingMode; use crate::tag::utils::test_utils::read_path; use super::*; diff --git a/src/id3/v2/write/chunk_file.rs b/src/id3/v2/write/chunk_file.rs index 1ee318edd..f0d383d66 100644 --- a/src/id3/v2/write/chunk_file.rs +++ b/src/id3/v2/write/chunk_file.rs @@ -1,6 +1,6 @@ +use crate::config::WriteOptions; use crate::error::Result; use crate::iff::chunk::Chunks; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; diff --git a/src/id3/v2/write/mod.rs b/src/id3/v2/write/mod.rs index b2b07e034..ef6a21b5a 100644 --- a/src/id3/v2/write/mod.rs +++ b/src/id3/v2/write/mod.rs @@ -2,6 +2,7 @@ mod chunk_file; mod frame; use super::Id3v2TagFlags; +use crate::config::WriteOptions; use crate::error::Result; use crate::file::FileType; use crate::id3::v2::frame::FrameRef; @@ -11,7 +12,6 @@ use crate::id3::v2::Id3v2Tag; use crate::id3::{find_id3v2, FindId3v2Config}; use crate::macros::{err, try_vec}; use crate::probe::Probe; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; @@ -283,9 +283,9 @@ fn calculate_crc(content: &[u8]) -> [u8; 5] { #[cfg(test)] mod tests { + use crate::config::WriteOptions; use crate::id3::v2::{Id3v2Tag, Id3v2TagFlags}; use crate::prelude::*; - use crate::WriteOptions; #[test] fn id3v2_write_crc32() { diff --git a/src/iff/aiff/read.rs b/src/iff/aiff/read.rs index 450ec73e3..c8ffbe033 100644 --- a/src/iff/aiff/read.rs +++ b/src/iff/aiff/read.rs @@ -1,11 +1,11 @@ use super::properties::AiffProperties; use super::tag::{AIFFTextChunks, Comment}; use super::AiffFile; +use crate::config::ParseOptions; use crate::error::Result; use crate::id3::v2::tag::Id3v2Tag; use crate::iff::chunk::Chunks; use crate::macros::{decode_err, err}; -use crate::probe::ParseOptions; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/iff/aiff/tag.rs b/src/iff/aiff/tag.rs index 5bbc0f07c..42bb48fb6 100644 --- a/src/iff/aiff/tag.rs +++ b/src/iff/aiff/tag.rs @@ -1,10 +1,10 @@ +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::iff::chunk::Chunks; use crate::macros::err; use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; @@ -483,10 +483,10 @@ where #[cfg(test)] mod tests { + use crate::config::{ParseOptions, WriteOptions}; use crate::iff::aiff::{AIFFTextChunks, Comment}; use crate::prelude::*; - use crate::probe::ParseOptions; - use crate::{ItemKey, ItemValue, Tag, TagItem, TagType, WriteOptions}; + use crate::{ItemValue, Tag, TagItem, TagType}; use std::io::Cursor; diff --git a/src/iff/chunk.rs b/src/iff/chunk.rs index 01719284b..9c59a3c2c 100644 --- a/src/iff/chunk.rs +++ b/src/iff/chunk.rs @@ -1,7 +1,7 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::id3::v2::tag::Id3v2Tag; use crate::macros::{err, try_vec}; -use crate::probe::ParsingMode; use crate::util::text::utf8_decode; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/iff/wav/read.rs b/src/iff/wav/read.rs index 59e6b4d8e..ceaa033ea 100644 --- a/src/iff/wav/read.rs +++ b/src/iff/wav/read.rs @@ -1,11 +1,11 @@ use super::properties::WavProperties; use super::tag::RIFFInfoList; use super::WavFile; +use crate::config::ParseOptions; use crate::error::Result; use crate::id3::v2::tag::Id3v2Tag; use crate::iff::chunk::Chunks; use crate::macros::decode_err; -use crate::probe::ParseOptions; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/iff/wav/tag/mod.rs b/src/iff/wav/tag/mod.rs index 8e732bd3c..10cd663e8 100644 --- a/src/iff/wav/tag/mod.rs +++ b/src/iff/wav/tag/mod.rs @@ -1,11 +1,11 @@ pub(super) mod read; mod write; +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{try_parse_year, Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; @@ -348,10 +348,11 @@ pub(crate) fn tagitems_into_riff<'a>( #[cfg(test)] mod tests { + use crate::config::WriteOptions; use crate::iff::chunk::Chunks; use crate::iff::wav::RIFFInfoList; use crate::prelude::*; - use crate::{Tag, TagType, WriteOptions}; + use crate::{Tag, TagType}; use byteorder::LittleEndian; diff --git a/src/iff/wav/tag/write.rs b/src/iff/wav/tag/write.rs index 58f727f3a..5fb38a63f 100644 --- a/src/iff/wav/tag/write.rs +++ b/src/iff/wav/tag/write.rs @@ -1,9 +1,9 @@ use super::RIFFInfoListRef; +use crate::config::WriteOptions; use crate::error::Result; use crate::iff::chunk::Chunks; use crate::iff::wav::read::verify_wav; use crate::macros::err; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; diff --git a/src/lib.rs b/src/lib.rs index 8bbe9166d..96899c0ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -152,10 +152,10 @@ pub(crate) mod _this_is_internal {} pub mod aac; pub mod ape; +pub mod config; pub mod error; pub(crate) mod file; pub mod flac; -pub(crate) mod global_options; pub mod id3; pub mod iff; pub(crate) mod macros; @@ -172,10 +172,8 @@ pub(crate) mod tag; mod traits; mod util; pub mod wavpack; -mod write_options; -pub use crate::probe::{read_from, read_from_path, ParseOptions, ParsingMode, Probe}; -pub use crate::write_options::WriteOptions; +pub use crate::probe::{read_from, read_from_path, Probe}; pub use crate::file::{BoundTaggedFile, FileType, TaggedFile, TaggedFileExt}; pub use crate::picture::{MimeType, Picture, PictureType}; @@ -185,8 +183,6 @@ pub use util::text::TextEncoding; pub use picture::PictureInformation; -pub use global_options::{apply_global_options, GlobalOptions}; - pub use lofty_attr::LoftyFile; pub mod prelude { diff --git a/src/macros.rs b/src/macros.rs index 1a2ededd0..2ec5ff582 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -73,9 +73,9 @@ macro_rules! parse_mode_choice { DEFAULT: $default:expr ) => { match $parse_mode { - $(crate::probe::ParsingMode::Strict => { $strict_handler },)? - $(crate::probe::ParsingMode::BestAttempt => { $best_attempt_handler },)? - $(crate::probe::ParsingMode::Relaxed => { $relaxed_handler },)? + $(crate::config::ParsingMode::Strict => { $strict_handler },)? + $(crate::config::ParsingMode::BestAttempt => { $best_attempt_handler },)? + $(crate::config::ParsingMode::Relaxed => { $relaxed_handler },)? _ => { $default } } }; @@ -86,9 +86,9 @@ macro_rules! parse_mode_choice { $(RELAXED: $relaxed_handler:expr $(,)?)? ) => { match $parse_mode { - $(crate::probe::ParsingMode::Strict => { $strict_handler },)? - $(crate::probe::ParsingMode::BestAttempt => { $best_attempt_handler },)? - $(crate::probe::ParsingMode::Relaxed => { $relaxed_handler },)? + $(crate::config::ParsingMode::Strict => { $strict_handler },)? + $(crate::config::ParsingMode::BestAttempt => { $best_attempt_handler },)? + $(crate::config::ParsingMode::Relaxed => { $relaxed_handler },)? #[allow(unreachable_patterns)] _ => {} } diff --git a/src/mp4/atom_info.rs b/src/mp4/atom_info.rs index 980d0d75a..90085bb65 100644 --- a/src/mp4/atom_info.rs +++ b/src/mp4/atom_info.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::{ErrorKind, LoftyError, Result}; use crate::macros::{err, try_vec}; -use crate::probe::ParsingMode; use crate::tag::item::ItemKey; use crate::tag::TagType; use crate::util::text::utf8_decode; diff --git a/src/mp4/ilst/mod.rs b/src/mp4/ilst/mod.rs index 3ab103b45..5520bd128 100644 --- a/src/mp4/ilst/mod.rs +++ b/src/mp4/ilst/mod.rs @@ -5,13 +5,13 @@ mod r#ref; pub(crate) mod write; use super::AtomIdent; +use crate::config::WriteOptions; use crate::error::LoftyError; use crate::mp4::ilst::atom::AtomDataStorage; use crate::picture::{Picture, PictureType, TOMBSTONE_PICTURE}; use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{try_parse_year, Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use atom::{AdvisoryRating, Atom, AtomData}; use std::borrow::Cow; @@ -759,6 +759,7 @@ impl From for Ilst { #[cfg(test)] mod tests { + use crate::config::{ParseOptions, ParsingMode, WriteOptions}; use crate::mp4::ilst::atom::AtomDataStorage; use crate::mp4::ilst::TITLE; use crate::mp4::read::AtomReader; @@ -766,9 +767,7 @@ mod tests { use crate::prelude::*; use crate::tag::utils::test_utils; use crate::tag::utils::test_utils::read_path; - use crate::{ - ItemKey, ItemValue, ParseOptions, ParsingMode, Tag, TagItem, TagType, WriteOptions, - }; + use crate::{ItemValue, Tag, TagItem, TagType}; use std::io::{Cursor, Read as _, Seek as _, Write as _}; @@ -853,10 +852,10 @@ mod tests { let len = tag.len(); let cursor = Cursor::new(tag); - let mut reader = AtomReader::new(cursor, crate::ParsingMode::Strict).unwrap(); + let mut reader = AtomReader::new(cursor, ParsingMode::Strict).unwrap(); let parsed_tag = - super::read::parse_ilst(&mut reader, crate::ParsingMode::Strict, len as u64).unwrap(); + super::read::parse_ilst(&mut reader, ParsingMode::Strict, len as u64).unwrap(); assert_eq!(expected_tag, parsed_tag); } @@ -871,15 +870,12 @@ mod tests { .unwrap(); let cursor = Cursor::new(&writer[8..]); - let mut reader = AtomReader::new(cursor, crate::ParsingMode::Strict).unwrap(); + let mut reader = AtomReader::new(cursor, ParsingMode::Strict).unwrap(); // Remove the ilst identifier and size - let temp_parsed_tag = super::read::parse_ilst( - &mut reader, - crate::ParsingMode::Strict, - (writer.len() - 8) as u64, - ) - .unwrap(); + let temp_parsed_tag = + super::read::parse_ilst(&mut reader, ParsingMode::Strict, (writer.len() - 8) as u64) + .unwrap(); assert_eq!(parsed_tag, temp_parsed_tag); } @@ -890,10 +886,9 @@ mod tests { let len = tag.len(); let cursor = Cursor::new(tag); - let mut reader = AtomReader::new(cursor, crate::ParsingMode::Strict).unwrap(); + let mut reader = AtomReader::new(cursor, ParsingMode::Strict).unwrap(); - let ilst = - super::read::parse_ilst(&mut reader, crate::ParsingMode::Strict, len as u64).unwrap(); + let ilst = super::read::parse_ilst(&mut reader, ParsingMode::Strict, len as u64).unwrap(); let tag: Tag = ilst.into(); @@ -1010,14 +1005,11 @@ mod tests { assert_eq!(old_free_size, PADDING_SIZE as u32); let cursor = Cursor::new(ilst_bytes); - let mut reader = AtomReader::new(cursor, crate::ParsingMode::Strict).unwrap(); + let mut reader = AtomReader::new(cursor, ParsingMode::Strict).unwrap(); - ilst = super::read::parse_ilst( - &mut reader, - crate::ParsingMode::Strict, - ilst_bytes.len() as u64, - ) - .unwrap(); + ilst = + super::read::parse_ilst(&mut reader, ParsingMode::Strict, ilst_bytes.len() as u64) + .unwrap(); } let mut file = tempfile::tempfile().unwrap(); diff --git a/src/mp4/ilst/read.rs b/src/mp4/ilst/read.rs index eea7faa69..f07cecabd 100644 --- a/src/mp4/ilst/read.rs +++ b/src/mp4/ilst/read.rs @@ -2,6 +2,7 @@ use super::constants::{ BE_SIGNED_INTEGER, BE_UNSIGNED_INTEGER, BMP, JPEG, PNG, RESERVED, UTF16, UTF8, }; use super::{Atom, AtomData, AtomIdent, Ilst}; +use crate::config::ParsingMode; use crate::error::{LoftyError, Result}; use crate::id3::v1::constants::GENRES; use crate::macros::{err, try_vec}; @@ -10,7 +11,6 @@ use crate::mp4::ilst::atom::AtomDataStorage; use crate::mp4::read::{skip_unneeded, AtomReader}; use crate::picture::{MimeType, Picture, PictureType}; use crate::util::text::{utf16_decode_bytes, utf8_decode}; -use crate::ParsingMode; use std::borrow::Cow; use std::io::{Cursor, Read, Seek, SeekFrom}; diff --git a/src/mp4/ilst/ref.rs b/src/mp4/ilst/ref.rs index 0bd44a999..0e0c5505c 100644 --- a/src/mp4/ilst/ref.rs +++ b/src/mp4/ilst/ref.rs @@ -2,9 +2,9 @@ // Reference Conversions // ********************* +use crate::config::WriteOptions; use crate::error::Result; use crate::mp4::{Atom, AtomData, AtomIdent, Ilst}; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::Write; diff --git a/src/mp4/ilst/write.rs b/src/mp4/ilst/write.rs index f129da726..a49215263 100644 --- a/src/mp4/ilst/write.rs +++ b/src/mp4/ilst/write.rs @@ -1,4 +1,5 @@ use super::r#ref::IlstRef; +use crate::config::{ParseOptions, WriteOptions}; use crate::error::{FileEncodingError, Result}; use crate::file::FileType; use crate::macros::{decode_err, err, try_vec}; @@ -8,8 +9,6 @@ use crate::mp4::read::{atom_tree, meta_is_full, nested_atom, verify_mp4, AtomRea use crate::mp4::write::{AtomWriter, AtomWriterCompanion, ContextualAtom}; use crate::mp4::AtomData; use crate::picture::{MimeType, Picture}; -use crate::probe::ParseOptions; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Cursor, Seek, SeekFrom, Write}; diff --git a/src/mp4/moov.rs b/src/mp4/moov.rs index 885d42cfe..6d2536fa7 100644 --- a/src/mp4/moov.rs +++ b/src/mp4/moov.rs @@ -2,9 +2,9 @@ use super::atom_info::{AtomIdent, AtomInfo}; use super::ilst::read::parse_ilst; use super::ilst::Ilst; use super::read::{meta_is_full, nested_atom, skip_unneeded, AtomReader}; +use crate::config::ParsingMode; use crate::error::Result; use crate::macros::decode_err; -use crate::ParsingMode; use std::io::{Read, Seek}; diff --git a/src/mp4/properties.rs b/src/mp4/properties.rs index 4c27bd79a..7d458d151 100644 --- a/src/mp4/properties.rs +++ b/src/mp4/properties.rs @@ -1,9 +1,9 @@ use super::atom_info::{AtomIdent, AtomInfo}; use super::read::{nested_atom, skip_unneeded, AtomReader}; +use crate::config::ParsingMode; use crate::error::{LoftyError, Result}; use crate::macros::{decode_err, err, try_vec}; use crate::math::RoundedDivision; -use crate::probe::ParsingMode; use crate::properties::FileProperties; use std::io::{Cursor, Read, Seek, SeekFrom}; diff --git a/src/mp4/read.rs b/src/mp4/read.rs index ffe7aa563..457132b7a 100644 --- a/src/mp4/read.rs +++ b/src/mp4/read.rs @@ -2,9 +2,9 @@ use super::atom_info::{AtomIdent, AtomInfo}; use super::moov::Moov; use super::properties::Mp4Properties; use super::Mp4File; +use crate::config::{ParseOptions, ParsingMode}; use crate::error::{ErrorKind, LoftyError, Result}; use crate::macros::{decode_err, err}; -use crate::probe::{ParseOptions, ParsingMode}; use crate::traits::SeekStreamLen; use crate::util::text::utf8_decode_str; diff --git a/src/mp4/write.rs b/src/mp4/write.rs index 6ca52c12c..e5bd7de43 100644 --- a/src/mp4/write.rs +++ b/src/mp4/write.rs @@ -1,7 +1,7 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::mp4::atom_info::{AtomIdent, AtomInfo, IDENTIFIER_LEN}; use crate::mp4::read::skip_unneeded; -use crate::probe::ParsingMode; use std::cell::{RefCell, RefMut}; use std::fs::File; diff --git a/src/mpeg/read.rs b/src/mpeg/read.rs index 54d36ebba..628e23684 100644 --- a/src/mpeg/read.rs +++ b/src/mpeg/read.rs @@ -1,13 +1,13 @@ use super::header::{cmp_header, search_for_frame_sync, Header, HeaderCmpResult, XingHeader}; use super::{MpegFile, MpegProperties}; use crate::ape::header::read_ape_header; +use crate::config::{ParseOptions, ParsingMode}; use crate::error::Result; use crate::id3::v2::header::Id3v2Header; use crate::id3::v2::read::parse_id3v2; use crate::id3::{find_id3v1, find_lyrics3v2, FindId3v2Config, ID3FindResults}; use crate::macros::{decode_err, err}; use crate::mpeg::header::HEADER_MASK; -use crate::probe::{ParseOptions, ParsingMode}; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/musepack/read.rs b/src/musepack/read.rs index a9365460e..09fd525d7 100644 --- a/src/musepack/read.rs +++ b/src/musepack/read.rs @@ -2,10 +2,10 @@ use super::sv4to6::MpcSv4to6Properties; use super::sv7::MpcSv7Properties; use super::sv8::MpcSv8Properties; use super::{MpcFile, MpcProperties, MpcStreamVersion}; +use crate::config::ParseOptions; use crate::error::Result; use crate::id3::v2::read::parse_id3v2; use crate::id3::{find_id3v1, find_id3v2, find_lyrics3v2, FindId3v2Config, ID3FindResults}; -use crate::probe::ParseOptions; use crate::traits::SeekStreamLen; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/musepack/sv4to6/properties.rs b/src/musepack/sv4to6/properties.rs index 18f60f66c..9f5b1c786 100644 --- a/src/musepack/sv4to6/properties.rs +++ b/src/musepack/sv4to6/properties.rs @@ -1,7 +1,7 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::macros::{decode_err, parse_mode_choice}; use crate::musepack::constants::{MPC_DECODER_SYNTH_DELAY, MPC_FRAME_LENGTH}; -use crate::probe::ParsingMode; use crate::properties::FileProperties; use std::io::Read; diff --git a/src/musepack/sv8/properties.rs b/src/musepack/sv8/properties.rs index bc26fcb59..4ad1fa184 100644 --- a/src/musepack/sv8/properties.rs +++ b/src/musepack/sv8/properties.rs @@ -1,7 +1,7 @@ use super::read::PacketReader; +use crate::config::ParsingMode; use crate::error::Result; use crate::musepack::constants::FREQUENCY_TABLE; -use crate::probe::ParsingMode; use crate::properties::FileProperties; use std::io::Read; diff --git a/src/musepack/sv8/read.rs b/src/musepack/sv8/read.rs index 913b89580..93c745b04 100644 --- a/src/musepack/sv8/read.rs +++ b/src/musepack/sv8/read.rs @@ -1,7 +1,7 @@ use super::properties::{EncoderInfo, MpcSv8Properties, ReplayGain, StreamHeader}; +use crate::config::ParsingMode; use crate::error::{ErrorKind, LoftyError, Result}; use crate::macros::{decode_err, parse_mode_choice}; -use crate::probe::ParsingMode; use std::io::Read; use std::time::Duration; diff --git a/src/ogg/opus/mod.rs b/src/ogg/opus/mod.rs index a30c197b2..4aa883346 100644 --- a/src/ogg/opus/mod.rs +++ b/src/ogg/opus/mod.rs @@ -2,9 +2,9 @@ pub(super) mod properties; use super::find_last_page; use super::tag::VorbisComments; +use crate::config::ParseOptions; use crate::error::Result; use crate::ogg::constants::{OPUSHEAD, OPUSTAGS}; -use crate::probe::ParseOptions; use properties::OpusProperties; use std::io::{Read, Seek}; diff --git a/src/ogg/read.rs b/src/ogg/read.rs index 0e9ba680f..17c26364b 100644 --- a/src/ogg/read.rs +++ b/src/ogg/read.rs @@ -1,9 +1,9 @@ use super::tag::VorbisComments; use super::verify_signature; +use crate::config::ParsingMode; use crate::error::{ErrorKind, LoftyError, Result}; use crate::macros::{decode_err, err, parse_mode_choice}; use crate::picture::{MimeType, Picture, PictureInformation, PictureType}; -use crate::probe::ParsingMode; use crate::util::text::{utf16_decode, utf8_decode, utf8_decode_str}; use std::borrow::Cow; diff --git a/src/ogg/speex/mod.rs b/src/ogg/speex/mod.rs index 9a79398e9..4af2b333d 100644 --- a/src/ogg/speex/mod.rs +++ b/src/ogg/speex/mod.rs @@ -1,9 +1,9 @@ pub(super) mod properties; use super::tag::VorbisComments; +use crate::config::ParseOptions; use crate::error::Result; use crate::ogg::constants::SPEEXHEADER; -use crate::probe::ParseOptions; use properties::SpeexProperties; use std::io::{Read, Seek}; diff --git a/src/ogg/tag.rs b/src/ogg/tag.rs index e5a6b9c5a..d9b2291c6 100644 --- a/src/ogg/tag.rs +++ b/src/ogg/tag.rs @@ -1,3 +1,4 @@ +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::file::FileType; use crate::macros::err; @@ -8,7 +9,6 @@ use crate::probe::Probe; use crate::tag::item::{ItemKey, ItemValue, TagItem}; use crate::tag::{try_parse_year, Tag, TagType}; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; -use crate::write_options::WriteOptions; use std::borrow::Cow; use std::fs::File; @@ -693,9 +693,10 @@ pub(crate) fn create_vorbis_comments_ref( #[cfg(test)] mod tests { + use crate::config::{ParsingMode, WriteOptions}; use crate::ogg::{OggPictureStorage, VorbisComments}; use crate::prelude::*; - use crate::{ItemKey, ItemValue, ParsingMode, Tag, TagItem, TagType, WriteOptions}; + use crate::{ItemValue, Tag, TagItem, TagType}; fn read_tag(tag: &[u8]) -> VorbisComments { let mut reader = std::io::Cursor::new(tag); diff --git a/src/ogg/vorbis/mod.rs b/src/ogg/vorbis/mod.rs index b01adeac4..6f401be8e 100644 --- a/src/ogg/vorbis/mod.rs +++ b/src/ogg/vorbis/mod.rs @@ -2,9 +2,9 @@ pub(super) mod properties; use super::find_last_page; use super::tag::VorbisComments; +use crate::config::ParseOptions; use crate::error::Result; use crate::ogg::constants::{VORBIS_COMMENT_HEAD, VORBIS_IDENT_HEAD}; -use crate::probe::ParseOptions; use properties::VorbisProperties; use std::io::{Read, Seek}; diff --git a/src/ogg/write.rs b/src/ogg/write.rs index f3a945e21..194c7886e 100644 --- a/src/ogg/write.rs +++ b/src/ogg/write.rs @@ -1,4 +1,5 @@ use super::verify_signature; +use crate::config::WriteOptions; use crate::error::Result; use crate::file::FileType; use crate::macros::{decode_err, err, try_vec}; @@ -6,7 +7,6 @@ use crate::ogg::constants::{OPUSTAGS, VORBIS_COMMENT_HEAD}; use crate::ogg::tag::{create_vorbis_comments_ref, VorbisCommentsRef}; use crate::picture::{Picture, PictureInformation}; use crate::tag::{Tag, TagType}; -use crate::write_options::WriteOptions; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; diff --git a/src/picture.rs b/src/picture.rs index e9d5b6851..9686ea294 100644 --- a/src/picture.rs +++ b/src/picture.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::{ErrorKind, LoftyError, Result}; use crate::macros::err; -use crate::probe::ParsingMode; use crate::util::text::utf8_decode_str; use std::borrow::Cow; diff --git a/src/probe.rs b/src/probe.rs index 6e691dfd7..d59ffbabe 100644 --- a/src/probe.rs +++ b/src/probe.rs @@ -1,9 +1,9 @@ use crate::aac::AacFile; use crate::ape::ApeFile; +use crate::config::{global_options, ParseOptions}; use crate::error::Result; use crate::file::{AudioFile, FileType, FileTypeGuessResult, TaggedFile}; use crate::flac::FlacFile; -use crate::global_options::global_options; use crate::iff::aiff::AiffFile; use crate::iff::wav::WavFile; use crate::macros::err; @@ -21,160 +21,6 @@ use std::fs::File; use std::io::{BufReader, Cursor, Read, Seek, SeekFrom}; use std::path::Path; -/// Options to control how Lofty parses a file -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[non_exhaustive] -pub struct ParseOptions { - pub(crate) read_properties: bool, - pub(crate) parsing_mode: ParsingMode, - pub(crate) max_junk_bytes: usize, -} - -impl Default for ParseOptions { - /// The default implementation for `ParseOptions` - /// - /// The defaults are as follows: - /// - /// ```rust,ignore - /// ParseOptions { - /// read_properties: true, - /// parsing_mode: ParsingMode::BestAttempt, - /// max_junk_bytes: 1024 - /// } - /// ``` - fn default() -> Self { - Self::new() - } -} - -impl ParseOptions { - /// Default parsing mode - pub const DEFAULT_PARSING_MODE: ParsingMode = ParsingMode::BestAttempt; - - /// Default number of junk bytes to read - pub const DEFAULT_MAX_JUNK_BYTES: usize = 1024; - - /// Creates a new `ParseOptions`, alias for `Default` implementation - /// - /// See also: [`ParseOptions::default`] - /// - /// # Examples - /// - /// ```rust - /// use lofty::ParseOptions; - /// - /// let parsing_options = ParseOptions::new(); - /// ``` - #[must_use] - pub const fn new() -> Self { - Self { - read_properties: true, - parsing_mode: Self::DEFAULT_PARSING_MODE, - max_junk_bytes: Self::DEFAULT_MAX_JUNK_BYTES, - } - } - - /// Whether or not to read the audio properties - /// - /// # Examples - /// - /// ```rust - /// use lofty::ParseOptions; - /// - /// // By default, `read_properties` is enabled. Here, we don't want to read them. - /// let parsing_options = ParseOptions::new().read_properties(false); - /// ``` - pub fn read_properties(&mut self, read_properties: bool) -> Self { - self.read_properties = read_properties; - *self - } - - /// The parsing mode to use, see [`ParsingMode`] for details - /// - /// # Examples - /// - /// ```rust - /// use lofty::{ParseOptions, ParsingMode}; - /// - /// // By default, `parsing_mode` is ParsingMode::BestAttempt. Here, we need absolute correctness. - /// let parsing_options = ParseOptions::new().parsing_mode(ParsingMode::Strict); - /// ``` - pub fn parsing_mode(&mut self, parsing_mode: ParsingMode) -> Self { - self.parsing_mode = parsing_mode; - *self - } - - /// The maximum number of allowed junk bytes to search - /// - /// Some information may be surrounded by junk bytes, such as tag padding remnants. This sets the maximum - /// number of junk/unrecognized bytes Lofty will search for required information before giving up. - /// - /// # Examples - /// - /// ```rust - /// use lofty::ParseOptions; - /// - /// // I have files full of junk, I'll double the search window! - /// let parsing_options = ParseOptions::new().max_junk_bytes(2048); - /// ``` - pub fn max_junk_bytes(&mut self, max_junk_bytes: usize) -> Self { - self.max_junk_bytes = max_junk_bytes; - *self - } -} - -/// The parsing strictness mode -/// -/// This can be set with [`Probe::options`]. -/// -/// # Examples -/// -/// ```rust,no_run -/// use lofty::{ParseOptions, ParsingMode, Probe}; -/// -/// # fn main() -> lofty::Result<()> { -/// // We only want to read spec-compliant inputs -/// let parsing_options = ParseOptions::new().parsing_mode(ParsingMode::Strict); -/// let tagged_file = Probe::open("foo.mp3")?.options(parsing_options).read()?; -/// # Ok(()) } -/// ``` -#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Default)] -#[non_exhaustive] -pub enum ParsingMode { - /// Will eagerly error on invalid input - /// - /// This mode will eagerly error on any non spec-compliant input. - /// - /// ## Examples of behavior - /// - /// * Unable to decode text - The parser will error and the entire input is discarded - /// * Unable to determine the sample rate - The parser will error and the entire input is discarded - Strict, - /// Default mode, less eager to error on recoverably malformed input - /// - /// This mode will attempt to fill in any holes where possible in otherwise valid, spec-compliant input. - /// - /// NOTE: A readable input does *not* necessarily make it writeable. - /// - /// ## Examples of behavior - /// - /// * Unable to decode text - If valid otherwise, the field will be replaced by an empty string and the parser moves on - /// * Unable to determine the sample rate - The sample rate will be 0 - #[default] - BestAttempt, - /// Least eager to error, may produce invalid/partial output - /// - /// This mode will discard any invalid fields, and ignore the majority of non-fatal errors. - /// - /// If the input is malformed, the resulting tags may be incomplete, and the properties zeroed. - /// - /// ## Examples of behavior - /// - /// * Unable to decode text - The entire item is discarded and the parser moves on - /// * Unable to determine the sample rate - The sample rate will be 0 - Relaxed, -} - /// A format agnostic reader /// /// This provides a way to determine the [`FileType`] of a reader, for when a concrete @@ -687,9 +533,9 @@ where #[cfg(test)] mod tests { - use crate::{FileType, GlobalOptions, Probe}; + use crate::config::{GlobalOptions, ParseOptions}; + use crate::{FileType, Probe}; - use lofty::ParseOptions; use std::fs::File; #[test] @@ -784,7 +630,7 @@ mod tests { let parse_options = ParseOptions::new().read_properties(false); let mut global_options = GlobalOptions::new().allocation_limit(50); - crate::global_options::apply_global_options(global_options); + crate::config::apply_global_options(global_options); // An allocation with a size of 40 bytes should be ok let within_limits = create_fake_mp3(40); @@ -802,7 +648,7 @@ mod tests { // Now test the default allocation limit (16MB), which should of course be ok with 60 bytes global_options.allocation_limit = GlobalOptions::DEFAULT_ALLOCATION_LIMIT; - crate::global_options::apply_global_options(global_options); + crate::config::apply_global_options(global_options); let probe = Probe::new(std::io::Cursor::new(&too_big)) .set_file_type(FileType::Mpeg) diff --git a/src/properties/tests.rs b/src/properties/tests.rs index 7112bf3d1..1a06c2bd7 100644 --- a/src/properties/tests.rs +++ b/src/properties/tests.rs @@ -1,5 +1,6 @@ use crate::aac::{AACProperties, AacFile}; use crate::ape::{ApeFile, ApeProperties}; +use crate::config::ParseOptions; use crate::file::AudioFile; use crate::flac::{FlacFile, FlacProperties}; use crate::iff::aiff::{AiffFile, AiffProperties}; @@ -13,7 +14,6 @@ use crate::musepack::{MpcFile, MpcProperties}; use crate::ogg::{ OpusFile, OpusProperties, SpeexFile, SpeexProperties, VorbisFile, VorbisProperties, }; -use crate::probe::ParseOptions; use crate::properties::ChannelMask; use crate::wavpack::{WavPackFile, WavPackProperties}; diff --git a/src/resolve.rs b/src/resolve.rs index fb759e95f..321fe62fb 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -1,9 +1,9 @@ //! Tools to create custom file resolvers //! //! For a full example of a custom resolver, see [this](https://github.com/Serial-ATA/lofty-rs/tree/main/examples/custom_resolver). +use crate::config::ParseOptions; use crate::error::Result; use crate::file::{AudioFile, FileType, TaggedFile}; -use crate::probe::ParseOptions; use crate::tag::TagType; use std::collections::HashMap; @@ -129,10 +129,9 @@ pub fn register_custom_resolver(name: &'static str) { #[cfg(test)] mod tests { + use crate::config::{GlobalOptions, ParseOptions}; use crate::file::{FileType, TaggedFileExt}; - use crate::global_options::GlobalOptions; use crate::id3::v2::Id3v2Tag; - use crate::probe::ParseOptions; use crate::properties::FileProperties; use crate::resolve::{register_custom_resolver, FileResolver}; use crate::tag::TagType; @@ -196,7 +195,7 @@ mod tests { register_custom_resolver::("MyFile"); let global_options = GlobalOptions::new().use_custom_resolvers(true); - crate::apply_global_options(global_options); + crate::config::apply_global_options(global_options); let path = "examples/custom_resolver/test_asset.myfile"; let read = crate::read_from_path(path).unwrap(); diff --git a/src/tag/mod.rs b/src/tag/mod.rs index b61158755..87cd00afa 100644 --- a/src/tag/mod.rs +++ b/src/tag/mod.rs @@ -1,6 +1,7 @@ pub(crate) mod item; pub(crate) mod utils; +use crate::config::WriteOptions; use crate::error::{LoftyError, Result}; use crate::file::FileType; use crate::macros::err; @@ -9,7 +10,6 @@ use crate::probe::Probe; use crate::traits::{Accessor, MergeTag, SplitTag, TagExt}; use item::{ItemKey, ItemValue, TagItem}; -use crate::WriteOptions; use std::borrow::Cow; use std::fs::{File, OpenOptions}; use std::io::Write; @@ -663,9 +663,10 @@ impl TagType { #[cfg(test)] mod tests { use super::try_parse_year; + use crate::config::WriteOptions; use crate::prelude::*; use crate::tag::utils::test_utils::read_path; - use crate::{Picture, PictureType, Tag, TagType, WriteOptions}; + use crate::{Picture, PictureType, Tag, TagType}; use std::io::{Seek, Write}; use std::process::Command; diff --git a/src/tag/utils.rs b/src/tag/utils.rs index 9ecc7c279..10673b523 100644 --- a/src/tag/utils.rs +++ b/src/tag/utils.rs @@ -1,8 +1,8 @@ +use crate::config::WriteOptions; use crate::error::Result; use crate::file::FileType; use crate::macros::err; use crate::tag::{Tag, TagType}; -use crate::write_options::WriteOptions; use crate::{aac, ape, flac, iff, mpeg, musepack, wavpack}; use crate::id3::v1::tag::Id3v1TagRef; diff --git a/src/traits.rs b/src/traits.rs index ec9e66641..973dfb81b 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -118,8 +118,8 @@ accessor_trait! { [year ], [comment ], String>, } +use crate::config::WriteOptions; use crate::tag::Tag; -use crate::write_options::WriteOptions; use std::fs::File; use std::path::Path; diff --git a/src/util/alloc.rs b/src/util/alloc.rs index 0fe53c912..42fd6b1db 100644 --- a/src/util/alloc.rs +++ b/src/util/alloc.rs @@ -1,7 +1,7 @@ use crate::error::Result; use crate::macros::err; -use crate::global_options::global_options; +use crate::config::global_options; /// Provides the `fallible_repeat` method on `Vec` /// diff --git a/src/wavpack/properties.rs b/src/wavpack/properties.rs index 1f01799b4..5eb5792cd 100644 --- a/src/wavpack/properties.rs +++ b/src/wavpack/properties.rs @@ -1,6 +1,6 @@ +use crate::config::ParsingMode; use crate::error::Result; use crate::macros::{decode_err, err, parse_mode_choice, try_vec}; -use crate::probe::ParsingMode; use crate::properties::{ChannelMask, FileProperties}; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/wavpack/read.rs b/src/wavpack/read.rs index 2d402fe20..b2ab8817f 100644 --- a/src/wavpack/read.rs +++ b/src/wavpack/read.rs @@ -1,8 +1,8 @@ use super::properties::WavPackProperties; use super::WavPackFile; +use crate::config::ParseOptions; use crate::error::Result; use crate::id3::{find_id3v1, find_lyrics3v2, ID3FindResults}; -use crate::probe::ParseOptions; use std::io::{Read, Seek, SeekFrom}; diff --git a/tests/files/aac.rs b/tests/files/aac.rs index 13a0a9d21..4f6170e20 100644 --- a/tests/files/aac.rs +++ b/tests/files/aac.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/aiff.rs b/tests/files/aiff.rs index 30a3316bf..a1d495161 100644 --- a/tests/files/aiff.rs +++ b/tests/files/aiff.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/ape.rs b/tests/files/ape.rs index 32b48e064..9ed0961ef 100644 --- a/tests/files/ape.rs +++ b/tests/files/ape.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/flac.rs b/tests/files/flac.rs index 954938b13..a9401280d 100644 --- a/tests/files/flac.rs +++ b/tests/files/flac.rs @@ -1,6 +1,6 @@ +use lofty::config::{ParseOptions, ParsingMode}; use lofty::flac::FlacFile; use lofty::prelude::*; -use lofty::{ParseOptions, ParsingMode}; use std::fs::File; use std::io::Seek; diff --git a/tests/files/mp4.rs b/tests/files/mp4.rs index abff918b8..eccb6e753 100644 --- a/tests/files/mp4.rs +++ b/tests/files/mp4.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/mpc.rs b/tests/files/mpc.rs index 69cee5528..cf7d707bd 100644 --- a/tests/files/mpc.rs +++ b/tests/files/mpc.rs @@ -1,9 +1,8 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::musepack::MpcFile; use lofty::prelude::*; -use lofty::{ - FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFile, TaggedFileExt, -}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType, TaggedFile}; use std::io::{Seek, Write}; diff --git a/tests/files/mpeg.rs b/tests/files/mpeg.rs index 6b9c40407..e7ebd5857 100644 --- a/tests/files/mpeg.rs +++ b/tests/files/mpeg.rs @@ -1,11 +1,9 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::{ParseOptions, WriteOptions}; use lofty::id3::v2::{Frame, FrameFlags, FrameId, FrameValue, Id3v2Tag, KeyValueFrame}; use lofty::mpeg::MpegFile; use lofty::prelude::*; -use lofty::{ - FileType, ItemKey, ItemValue, ParseOptions, Probe, Tag, TagItem, TagType, TaggedFileExt, - WriteOptions, -}; +use lofty::{FileType, ItemValue, Probe, Tag, TagItem, TagType}; use std::borrow::Cow; use std::io::{Seek, Write}; diff --git a/tests/files/ogg.rs b/tests/files/ogg.rs index 9528eb361..aaaef0714 100644 --- a/tests/files/ogg.rs +++ b/tests/files/ogg.rs @@ -1,9 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::{ParseOptions, WriteOptions}; use lofty::prelude::*; -use lofty::{ - FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt, - WriteOptions, -}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/util/mod.rs b/tests/files/util/mod.rs index 802612b66..29138282b 100644 --- a/tests/files/util/mod.rs +++ b/tests/files/util/mod.rs @@ -69,7 +69,7 @@ macro_rules! set_artist { $file_write.rewind().unwrap(); - $tag.save_to(&mut $file_write, lofty::WriteOptions::default()) + $tag.save_to(&mut $file_write, lofty::config::WriteOptions::default()) .unwrap(); }; } @@ -80,7 +80,7 @@ macro_rules! remove_tag { let mut file = temp_file!($path); let tagged_file = lofty::Probe::new(&mut file) - .options(lofty::ParseOptions::new().read_properties(false)) + .options(lofty::config::ParseOptions::new().read_properties(false)) .guess_file_type() .unwrap() .read() @@ -94,7 +94,7 @@ macro_rules! remove_tag { file.rewind().unwrap(); let tagged_file = lofty::Probe::new(&mut file) - .options(lofty::ParseOptions::new().read_properties(false)) + .options(lofty::config::ParseOptions::new().read_properties(false)) .guess_file_type() .unwrap() .read() diff --git a/tests/files/wav.rs b/tests/files/wav.rs index 1bf888a12..9e3ccf094 100644 --- a/tests/files/wav.rs +++ b/tests/files/wav.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/wavpack.rs b/tests/files/wavpack.rs index 8e11de576..93a4b141a 100644 --- a/tests/files/wavpack.rs +++ b/tests/files/wavpack.rs @@ -1,6 +1,7 @@ use crate::{set_artist, temp_file, verify_artist}; +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::{FileType, ItemKey, ItemValue, ParseOptions, Probe, TagItem, TagType, TaggedFileExt}; +use lofty::{FileType, ItemValue, Probe, TagItem, TagType}; use std::io::{Seek, Write}; diff --git a/tests/files/zero_sized.rs b/tests/files/zero_sized.rs index 075985010..518945d12 100644 --- a/tests/files/zero_sized.rs +++ b/tests/files/zero_sized.rs @@ -1,11 +1,11 @@ use lofty::ape::ApeFile; +use lofty::config::{ParseOptions, ParsingMode}; use lofty::flac::FlacFile; use lofty::iff::aiff::AiffFile; use lofty::iff::wav::WavFile; use lofty::mp4::Mp4File; use lofty::mpeg::MpegFile; use lofty::prelude::*; -use lofty::{ParseOptions, ParsingMode}; fn read_file_with_properties(path: &str) -> bool { let res = ::read_from( diff --git a/tests/fuzz/id3v2.rs b/tests/fuzz/id3v2.rs index f66b5c2e8..33cc7b1ca 100644 --- a/tests/fuzz/id3v2.rs +++ b/tests/fuzz/id3v2.rs @@ -18,7 +18,7 @@ fn overflow1() { 50, 5, 5, 5, 26, 5, 5, 25, 6, 6, 25, 26, 246, 25, 25, 129, 6, 151, 3, 252, 56, 0, 53, 56, 55, 52, ]; - let _local0 = ::default(); + let _local0 = ::default(); let _local1_param0_helper1 = &mut (&data[..]); let _: lofty::error::Result< std::option::Option, diff --git a/tests/fuzz/main.rs b/tests/fuzz/main.rs index 2141671c8..4d0383b4c 100644 --- a/tests/fuzz/main.rs +++ b/tests/fuzz/main.rs @@ -1,5 +1,5 @@ +use lofty::config::ParseOptions; use lofty::prelude::*; -use lofty::ParseOptions; use std::io::Cursor; use std::path::Path; diff --git a/tests/fuzz/mpegfile_read_from.rs b/tests/fuzz/mpegfile_read_from.rs index d51b48af0..ff9f89c71 100644 --- a/tests/fuzz/mpegfile_read_from.rs +++ b/tests/fuzz/mpegfile_read_from.rs @@ -1,7 +1,7 @@ use crate::{get_reader, oom_test}; +use lofty::config::ParseOptions; use lofty::mpeg::MpegFile; use lofty::prelude::*; -use lofty::ParseOptions; #[test] fn crash1() { diff --git a/tests/hound.rs b/tests/hound.rs index ad9b7f5a0..83846c961 100644 --- a/tests/hound.rs +++ b/tests/hound.rs @@ -1,7 +1,7 @@ +use lofty::config::ParseOptions; use lofty::error::Result; use lofty::iff::wav::WavFile; use lofty::prelude::*; -use lofty::ParseOptions; use hound::WavReader; diff --git a/tests/picture/format_parsers.rs b/tests/picture/format_parsers.rs index b963c028c..6265f9663 100644 --- a/tests/picture/format_parsers.rs +++ b/tests/picture/format_parsers.rs @@ -1,5 +1,6 @@ +use lofty::config::ParsingMode; use lofty::id3::v2::{AttachedPictureFrame, Id3v2Version}; -use lofty::{ParsingMode, Picture, PictureInformation, PictureType, TextEncoding}; +use lofty::{Picture, PictureInformation, PictureType, TextEncoding}; use std::fs::File; use std::io::Read;