diff --git a/src/lib.rs b/src/lib.rs index 2a0a31b..ea5b88f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,8 +2,8 @@ use std::io::{Read, Seek}; use serde::de::Error as _; use serde::Deserialize; +use serde_json::{Deserializer, StreamDeserializer}; use serde_json::de::IoRead; -use serde_json::StreamDeserializer; pub use zip::{read::ZipFile, ZipArchive}; use crate::error::{Error, Result}; @@ -15,6 +15,16 @@ pub mod error; pub(crate) mod tracking_reader; pub mod ttmp_extractor; +pub fn from_value(value: serde_json::Value) -> Result { + let manifest = if value.is_array() { + ManifestKind::V1(serde_json::from_value(value).map_err(Error::InvalidManifest)?) + } else { + ManifestKind::V2(serde_json::from_value(value).map_err(Error::InvalidManifest)?) + }; + + Ok(manifest) +} + pub fn from_reader(reader: R) -> Result<(ManifestKind, ZipArchive)> { let mut zip = ZipArchive::new(reader).map_err(Error::Zip)?; let manifest = zip.by_name("TTMPL.mpl").map_err(Error::Zip)?;