use crate::verified_user::VerifiedUser;
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct ServiceIdentity {
service_id: String,
}
impl ServiceIdentity {
#[allow(dead_code)]
pub(crate) fn new_sealed(service_id: String) -> Self {
Self { service_id }
}
pub fn service_id(&self) -> &str {
&self.service_id
}
}
#[derive(Debug, Clone, Serialize)]
pub enum Principal {
User(VerifiedUser),
Service(ServiceIdentity),
Anonymous,
}
impl Principal {
#[allow(dead_code)]
pub(crate) fn anonymous_sealed() -> Self {
Self::Anonymous
}
#[allow(dead_code)]
pub(crate) fn user_sealed(verified: VerifiedUser) -> Self {
Self::User(verified)
}
#[allow(dead_code)]
pub(crate) fn service_sealed(service: ServiceIdentity) -> Self {
Self::Service(service)
}
pub fn is_user(&self) -> bool {
matches!(self, Self::User(_))
}
pub fn is_anonymous(&self) -> bool {
matches!(self, Self::Anonymous)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn principal_anonymous_constructs() {
let p = Principal::anonymous_sealed();
assert!(p.is_anonymous());
assert!(!p.is_user());
}
#[test]
fn principal_user_carries_verified() {
let v = VerifiedUser::new_sealed(
"alice".to_string(),
"https://idp.example.com".to_string(),
1_700_000_000,
1_700_003_600,
);
let p = Principal::user_sealed(v);
assert!(p.is_user());
match p {
Principal::User(v) => assert_eq!(v.user_id(), "alice"),
_ => unreachable!("expected User variant"),
}
}
#[test]
fn principal_service_carries_identity() {
let s = ServiceIdentity::new_sealed("plexus.example".to_string());
let p = Principal::service_sealed(s);
match p {
Principal::Service(s) => assert_eq!(s.service_id(), "plexus.example"),
_ => unreachable!("expected Service variant"),
}
}
}