use clap::ValueEnum;
use crate::model::KnowledgeBase;
const EMBEDDED_LINUX: &str = include_str!("../data/knowledge.json");
const EMBEDDED_WINDOWS: &str = include_str!("../data/knowledge-windows.json");
const EMBEDDED_MACOS: &str = include_str!("../data/knowledge-macos.json");
#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)]
pub enum Platform {
#[value(name = "linux-auditd", alias = "linux")]
LinuxAuditd,
#[value(name = "windows-sysmon", alias = "windows")]
WindowsSysmon,
#[value(name = "macos-es", alias = "macos")]
MacosEs,
}
impl Platform {
pub fn sigma_product(self) -> &'static str {
match self {
Platform::LinuxAuditd => "linux",
Platform::WindowsSysmon => "windows",
Platform::MacosEs => "macos",
}
}
}
pub fn load(platform: Platform) -> Result<KnowledgeBase, serde_json::Error> {
use serde::de::Error as _;
let raw = match platform {
Platform::LinuxAuditd => EMBEDDED_LINUX,
Platform::WindowsSysmon => EMBEDDED_WINDOWS,
Platform::MacosEs => EMBEDDED_MACOS,
};
let kb: KnowledgeBase = serde_json::from_str(raw)?;
kb.validate().map_err(serde_json::Error::custom)?;
Ok(kb)
}