pub const THREATDB_NAME: &str = "threatdb";
pub const THREATDB_DATABASE_TYPE: &str = "ThreatDB-v1";
#[derive(Debug, Clone)]
pub struct SchemaInfo {
pub name: &'static str,
pub database_type: &'static str,
pub description: &'static str,
}
pub static SCHEMAS: &[SchemaInfo] = &[SchemaInfo {
name: THREATDB_NAME,
database_type: THREATDB_DATABASE_TYPE,
description: "Threat intelligence database with MISP/STIX-compatible fields",
}];
#[must_use]
pub fn get_schema_info(name: &str) -> Option<&'static SchemaInfo> {
SCHEMAS.iter().find(|s| s.name == name)
}
#[must_use]
pub fn schema_database_type(name: &str) -> Option<&'static str> {
SCHEMAS
.iter()
.find(|s| s.name == name)
.map(|s| s.database_type)
}
#[must_use]
pub fn detect_schema_from_database_type(database_type: &str) -> Option<&'static str> {
SCHEMAS
.iter()
.find(|s| s.database_type == database_type)
.map(|s| s.name)
}
pub fn available_schemas() -> impl Iterator<Item = &'static str> {
SCHEMAS.iter().map(|s| s.name)
}
#[must_use]
pub fn is_known_database_type(name: &str) -> bool {
SCHEMAS
.iter()
.any(|s| s.name == name || s.database_type == name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_schema_database_type() {
assert_eq!(schema_database_type("threatdb"), Some("ThreatDB-v1"));
assert_eq!(schema_database_type("nonexistent"), None);
}
#[test]
fn test_detect_schema() {
assert_eq!(
detect_schema_from_database_type("ThreatDB-v1"),
Some("threatdb")
);
assert_eq!(detect_schema_from_database_type("Unknown-Type"), None);
}
#[test]
fn test_is_known_database_type() {
assert!(is_known_database_type("threatdb"));
assert!(is_known_database_type("ThreatDB-v1"));
assert!(!is_known_database_type("Unknown-Type"));
}
#[test]
fn test_available_schemas() {
let schemas: Vec<_> = available_schemas().collect();
assert!(schemas.contains(&"threatdb"));
assert_eq!(schemas.len(), 1);
}
#[test]
fn test_schema_info() {
let info = get_schema_info("threatdb").expect("should exist");
assert_eq!(info.name, "threatdb");
assert_eq!(info.database_type, "ThreatDB-v1");
assert!(info.description.contains("Threat intelligence"));
}
}