securitydept_utils/
principal.rs1use 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}