use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(u8)]
pub enum ObservableTypeId {
Unknown = 0,
IpAddress = 2,
Domain = 3,
FilePath = 7,
FileName = 8,
ProcessName = 9,
Url = 20,
Hash = 28,
Other = 99,
}
impl ObservableTypeId {
#[must_use]
pub const fn as_u8(self) -> u8 {
self as u8
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Observable {
pub name: String,
pub value: String,
pub type_id: u8,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn observable_roundtrip() {
let o = Observable {
name: "file.path".to_string(),
value: "/etc/shadow".to_string(),
type_id: ObservableTypeId::FilePath.as_u8(),
r#type: Some("File Path".to_string()),
};
let json = serde_json::to_string(&o).unwrap();
let o2: Observable = serde_json::from_str(&json).unwrap();
assert_eq!(o, o2);
}
}