use crate::csaf::traits::util::not_present_20::NotPresentInCsaf20;
use crate::csaf_traits::{SharingGroupTrait, TlpTrait};
use crate::schema::csaf2_0::schema::{
RulesForSharingDocument as RulesForSharingDocument20, TrafficLightProtocolTlp as TrafficLightProtocolTlp20,
};
use crate::schema::csaf2_1::schema::{
RulesForDocumentSharing as RulesForDocumentSharing21, SharingGroup as SharingGroup21,
TrafficLightProtocolTlp as TrafficLightProtocolTlp21,
};
use crate::validation::ValidationError;
pub trait DistributionTrait {
type SharingGroupType: SharingGroupTrait;
type TlpType: TlpTrait;
fn get_sharing_group(&self) -> Option<&Self::SharingGroupType>;
fn get_tlp_20(&self) -> Option<&Self::TlpType>;
fn get_tlp_21(&self) -> Result<&Self::TlpType, ValidationError>;
}
impl DistributionTrait for RulesForSharingDocument20 {
type SharingGroupType = NotPresentInCsaf20;
type TlpType = TrafficLightProtocolTlp20;
fn get_sharing_group(&self) -> Option<&Self::SharingGroupType> {
None
}
fn get_tlp_20(&self) -> Option<&Self::TlpType> {
self.tlp.as_ref()
}
fn get_tlp_21(&self) -> Result<&Self::TlpType, ValidationError> {
match self.tlp.as_ref() {
None => Err(ValidationError {
message: "CSAF 2.1 requires the TLP property, but it is not set.".to_string(),
instance_path: "/document/distribution/tlp".to_string(),
}),
Some(tlp) => Ok(tlp),
}
}
}
impl DistributionTrait for RulesForDocumentSharing21 {
type SharingGroupType = SharingGroup21;
type TlpType = TrafficLightProtocolTlp21;
fn get_sharing_group(&self) -> Option<&Self::SharingGroupType> {
self.sharing_group.as_ref()
}
fn get_tlp_20(&self) -> Option<&Self::TlpType> {
Some(&self.tlp)
}
fn get_tlp_21(&self) -> Result<&Self::TlpType, ValidationError> {
Ok(&self.tlp)
}
}