use serde::ser::SerializeStruct;
use serde::{Deserialize, Serialize, Serializer};
use crate::results::MinimalFallback;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ArchiveEntry {
pub path: String,
pub size: u64,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ArchiveMetadata {
pub format: Option<String>,
pub file_count: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<ArchiveEntry>>,
pub compressed_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uncompressed_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
impl Serialize for ArchiveMetadata {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("ArchiveMetadata", 7)?;
crate::serialize_optional!(state, self.format, "format");
crate::serialize_optional!(state, self.file_count, "file_count");
crate::serialize_optional!(state, self.entries, "entries");
crate::serialize_optional!(state, self.compressed_size, "compressed_size");
crate::serialize_optional!(state, self.uncompressed_size, "uncompressed_size");
crate::serialize_optional!(state, self.truncated, "truncated");
crate::serialize_optional!(state, self.note, "note");
state.end()
}
}
impl MinimalFallback for ArchiveMetadata {
fn minimal_fallback(file_size_bytes: usize) -> Self {
Self {
compressed_size: Some(file_size_bytes as u64),
..Default::default()
}
}
}