arcp_core/messages/
credentials.rs1use serde::{Deserialize, Serialize};
8
9use crate::messages::permissions::LeaseRequest;
10
11#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
13#[serde(transparent)]
14pub struct CredentialId(
15 pub String,
17);
18
19impl CredentialId {
20 #[must_use]
22 pub fn new(sequence: u64) -> Self {
23 Self(format!("cred_{sequence:016x}"))
24 }
25
26 #[must_use]
28 pub fn as_str(&self) -> &str {
29 &self.0
30 }
31}
32
33impl std::fmt::Display for CredentialId {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 f.write_str(&self.0)
36 }
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
41#[serde(rename_all = "snake_case")]
42#[non_exhaustive]
43pub enum CredentialScheme {
44 Bearer,
46}
47
48#[derive(Clone, PartialEq, Serialize, Deserialize)]
50pub struct ProvisionedCredential {
51 pub id: CredentialId,
53 pub scheme: CredentialScheme,
55 pub value: String,
57 pub endpoint: String,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub profile: Option<String>,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub constraints: Option<LeaseRequest>,
65}
66
67impl std::fmt::Debug for ProvisionedCredential {
68 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69 f.debug_struct("ProvisionedCredential")
70 .field("id", &self.id)
71 .field("scheme", &self.scheme)
72 .field("value", &"<redacted>")
73 .field("endpoint", &self.endpoint)
74 .field("profile", &self.profile)
75 .field("constraints", &self.constraints)
76 .finish()
77 }
78}