use serde::{Deserialize, Serialize};
pub use ulid::Ulid;
pub fn ulid_from_seed(seed: &str) -> Ulid {
let mut h: u128 = 0x6c62_272e_07bb_0142_62b8_2175_6295_c58d;
for b in seed.bytes() {
h ^= b as u128;
h = h.wrapping_mul(0x0000_0000_0100_0000_0000_0000_0000_013b);
}
Ulid::from_parts((h >> 80) as u64, h & 0x_ffff_ffff_ffff_ffff_ffff)
}
pub type NodeId = Ulid;
pub type EdgeId = Ulid;
pub type TypeName = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Node {
pub id: NodeId,
pub name: String,
pub r#type: TypeName,
pub sot_ref: Option<String>,
pub confidence: Option<f64>,
pub applicability: Option<String>,
pub last_verified_at: Option<i64>,
pub review_due: Option<i64>,
pub version: u32,
pub prev_id: Option<NodeId>,
pub metadata: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Edge {
pub id: EdgeId,
pub name: Option<String>,
pub src_node: NodeId,
pub tgt_node: NodeId,
pub kind: TypeName,
pub severity: Option<Severity>,
pub metadata: serde_json::Value,
pub version: u32,
pub prev_id: Option<EdgeId>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Severity {
Hard,
Soft,
Advisory,
}