use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProviderMetadata {
pub canonical_url: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub distributions: Vec<ProviderDistribution>,
pub last_updated: String,
#[serde(default, rename = "list_on_CSAF_aggregators")]
pub list_on_csaf_aggregators: bool,
pub metadata_version: String,
#[serde(default, rename = "mirror_on_CSAF_aggregators")]
pub mirror_on_csaf_aggregators: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub public_openpgp_keys: Vec<OpenPgpKey>,
pub publisher: ProviderPublisher,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProviderDistribution {
pub directory_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenPgpKey {
pub fingerprint: String,
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProviderPublisher {
pub category: String,
pub contact_details: String,
pub name: String,
pub namespace: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_provider_metadata() {
let json = include_str!("../../../test/csaf/provider-metadata.json");
let meta: ProviderMetadata =
serde_json::from_str(json).expect("Failed to deserialize provider metadata");
assert_eq!(meta.metadata_version, "2.0");
assert_eq!(meta.role, "csaf_publisher");
assert_eq!(meta.publisher.category, "vendor");
assert!(meta.list_on_csaf_aggregators);
assert!(meta.mirror_on_csaf_aggregators);
assert_eq!(meta.public_openpgp_keys.len(), 1);
assert_eq!(
meta.public_openpgp_keys[0].fingerprint,
"D1DE14AA6D1980BD3FB67BF5C706DFBCAC5EFA64"
);
}
#[test]
fn test_roundtrip_provider_metadata() {
let json = include_str!("../../../test/csaf/provider-metadata.json");
let meta: ProviderMetadata = serde_json::from_str(json).expect("parse error");
let serialized = serde_json::to_string_pretty(&meta).expect("serialize error");
let meta2: ProviderMetadata = serde_json::from_str(&serialized).expect("re-parse error");
assert_eq!(meta, meta2);
}
}