Skip to main content

securitydept_utils/
principal.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use typed_builder::TypedBuilder;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TypedBuilder)]
8pub struct AuthenticatedPrincipal {
9    #[builder(setter(into))]
10    pub subject: String,
11    #[builder(setter(into))]
12    pub display_name: String,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    #[builder(default, setter(strip_option, into))]
15    pub picture: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    #[builder(default, setter(strip_option, into))]
18    pub issuer: Option<String>,
19    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
20    #[builder(default)]
21    pub claims: HashMap<String, Value>,
22}
23
24#[cfg(test)]
25mod tests {
26    use super::AuthenticatedPrincipal;
27
28    #[test]
29    fn builder_preserves_shared_authenticated_principal_fields() {
30        let principal = AuthenticatedPrincipal::builder()
31            .subject("user-1")
32            .display_name("Alice")
33            .issuer("https://issuer.example.com")
34            .build();
35
36        assert_eq!(principal.subject, "user-1");
37        assert_eq!(principal.display_name, "Alice");
38        assert_eq!(
39            principal.issuer.as_deref(),
40            Some("https://issuer.example.com")
41        );
42    }
43}