use std::collections::BTreeMap;
use serde::ser::SerializeStruct;
use serde::{Deserialize, Serialize, Serializer};
use crate::results::MinimalFallback;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ZipEntry {
pub path: String,
pub uncompressed_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compressed_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub detected_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modified: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compression_method: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ZipMetadata {
pub file_size: Option<usize>,
pub file_count: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<ZipEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_uncompressed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_compressed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entry_type_counts: Option<BTreeMap<String, usize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
}
impl Serialize for ZipMetadata {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("ZipMetadata", 7)?;
crate::serialize_optional!(state, self.file_size, "file_size");
crate::serialize_optional!(state, self.file_count, "file_count");
crate::serialize_optional!(state, self.entries, "entries");
crate::serialize_optional!(state, self.total_uncompressed, "total_uncompressed");
crate::serialize_optional!(state, self.total_compressed, "total_compressed");
crate::serialize_optional!(state, self.entry_type_counts, "entry_type_counts");
crate::serialize_optional!(state, self.comment, "comment");
state.end()
}
}
crate::impl_minimal_fallback!(ZipMetadata, file_size);