use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MetadataReport {
pub fields: Vec<MetadataField>,
pub warnings: Vec<MetadataWarning>,
}
impl MetadataReport {
pub fn has_warnings(&self) -> bool {
!self.warnings.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetadataField {
pub category: MetadataCategory,
pub key: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MetadataCategory {
DocumentProperties,
RevisionHistory,
ImageExif,
Xmp,
TemplateReference,
Software,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetadataWarning {
pub field: MetadataField,
pub severity: WarningSeverity,
pub reason: String,
pub strippable: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum WarningSeverity {
Info,
Warn,
High,
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn metadata_report_has_warnings_empty() {
let report = MetadataReport::default();
assert!(!report.has_warnings());
}
#[test]
fn metadata_report_has_warnings_populated() {
let warning = MetadataWarning {
field: MetadataField {
category: MetadataCategory::DocumentProperties,
key: "Author".to_string(),
value: "John Doe".to_string(),
},
severity: WarningSeverity::Warn,
reason: "Reveals author identity".to_string(),
strippable: true,
};
let report = MetadataReport {
fields: vec![],
warnings: vec![warning],
};
assert!(report.has_warnings());
}
}