use crate::asset::serialize::CompressionMode;
#[derive(Debug, Clone, PartialOrd, PartialEq)]
#[derive(serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
pub enum SerializedData {
Compressed(
CompressionMode,
#[serde(with = "serde_bytes")]
Vec<u8>,
),
Uncompressed(
#[serde(with = "serde_bytes")]
Vec<u8>,
),
}
impl SerializedData {
pub fn compression_mode(&self) -> Option<CompressionMode> {
match self {
SerializedData::Compressed(mode, _) => Some(*mode),
SerializedData::Uncompressed(_) => None,
}
}
pub fn data(&self) -> &[u8] {
match self {
SerializedData::Compressed(_, data) => data,
SerializedData::Uncompressed(data) => data,
}
}
}
#[cfg(test)]
mod test {
use super::*;
use rand::prelude::*;
use serde_json::json;
#[test]
fn compressed_enum_repr() {
let mut bytes = vec![0u8; 128];
rand::rng().fill(&mut bytes[..]);
let data = SerializedData::Compressed(CompressionMode::Zlib, bytes.clone());
let expected = json!([CompressionMode::Zlib, bytes]);
let serialized = serde_json::to_value(data).unwrap();
assert_eq!(expected, serialized);
}
#[test]
fn uncompressed_enum_repr() {
let mut bytes = vec![0u8; 128];
rand::rng().fill(&mut bytes[..]);
let data = SerializedData::Uncompressed(bytes.clone());
let expected = json!(bytes);
let serialized = serde_json::to_value(data).unwrap();
assert_eq!(expected, serialized);
}
}