mod archive;
mod audio;
mod binary;
mod clock;
mod compression;
mod consumer;
mod container;
mod hex;
mod json;
mod millis;
mod mode;
mod priority;
mod root;
pub mod stalled;
mod text;
mod video;
pub use archive::*;
pub use audio::*;
pub use binary::*;
pub use clock::*;
pub use compression::*;
pub use consumer::*;
pub use container::*;
pub use json::*;
pub use mode::*;
pub use priority::*;
pub use root::*;
pub use text::*;
pub use video::*;
pub(crate) fn deserialize_timescale_or_default<'de, D>(deserializer: D) -> Result<u32, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::Deserialize;
let value = u32::deserialize(deserializer)?;
if value == 0 {
return Err(serde::de::Error::custom("invalid timescale: 0"));
}
Ok(value)
}
pub trait Section: Default + serde::de::DeserializeOwned {
const MAP: &'static str;
}
pub fn deserialize_section<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
D: serde::Deserializer<'de>,
T: Section,
{
use serde::Deserialize;
let value = serde_json::Value::deserialize(deserializer)?;
if !value.get(T::MAP).is_some_and(serde_json::Value::is_object) {
return Ok(T::default());
}
serde_json::from_value(value).map_err(serde::de::Error::custom)
}