use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Attack {
#[serde(skip_serializing_if = "Option::is_none")]
pub tactic: Option<AttackTactic>,
#[serde(skip_serializing_if = "Option::is_none")]
pub technique: Option<AttackTechnique>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AttackTactic {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AttackTechnique {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn attack_roundtrip() {
let a = Attack {
tactic: Some(AttackTactic {
name: "Credential Access".to_string(),
uid: Some("TA0006".to_string()),
}),
technique: Some(AttackTechnique {
name: "OS Credential Dumping".to_string(),
uid: Some("T1003".to_string()),
}),
version: Some("14.1".to_string()),
};
let json = serde_json::to_string(&a).unwrap();
let a2: Attack = serde_json::from_str(&json).unwrap();
assert_eq!(a, a2);
}
}