use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum TrustLevel {
Low = 1,
Medium = 2,
High = 3,
}
impl Default for TrustLevel {
fn default() -> Self {
Self::Low
}
}
impl std::fmt::Display for TrustLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TrustLevel::Low => write!(f, "Low (Level 1)"),
TrustLevel::Medium => write!(f, "Medium (Level 2)"),
TrustLevel::High => write!(f, "High (Level 3)"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IdentityBinding {
pub provider: String,
pub id: String,
pub trust_level: TrustLevel,
pub bound_at: String,
}
pub trait IdentityProvider: Send + Sync {
fn bindings(&self) -> Vec<IdentityBinding>;
fn add_binding(&mut self, provider: &str, id: &str, level: TrustLevel) -> anyhow::Result<()>;
fn max_trust_level(&self) -> TrustLevel;
fn has_binding(&self, provider: &str) -> bool;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn trust_level_ordering() {
assert_eq!(TrustLevel::Low as u8, 1);
assert_eq!(TrustLevel::High as u8, 3);
}
#[test]
fn trust_level_display() {
assert_eq!(format!("{}", TrustLevel::Low), "Low (Level 1)");
assert_eq!(format!("{}", TrustLevel::High), "High (Level 3)");
}
#[test]
fn identity_binding_serializes() {
let binding = IdentityBinding {
provider: "google".to_string(),
id: "user@gmail.com".to_string(),
trust_level: TrustLevel::Low,
bound_at: "2026-01-01T00:00:00Z".to_string(),
};
let json = serde_json::to_string(&binding).unwrap();
let parsed: IdentityBinding = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.provider, "google");
assert_eq!(parsed.trust_level, TrustLevel::Low);
}
#[test]
fn default_trust_level_is_low() {
assert_eq!(TrustLevel::default(), TrustLevel::Low);
}
}