use serde::{Deserialize, Serialize};
use crate::messages::permissions::LeaseRequest;
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CredentialId(
pub String,
);
impl CredentialId {
#[must_use]
pub fn new(sequence: u64) -> Self {
Self(format!("cred_{sequence:016x}"))
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for CredentialId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum CredentialScheme {
Bearer,
}
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct ProvisionedCredential {
pub id: CredentialId,
pub scheme: CredentialScheme,
pub value: String,
pub endpoint: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub constraints: Option<LeaseRequest>,
}
impl std::fmt::Debug for ProvisionedCredential {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ProvisionedCredential")
.field("id", &self.id)
.field("scheme", &self.scheme)
.field("value", &"<redacted>")
.field("endpoint", &self.endpoint)
.field("profile", &self.profile)
.field("constraints", &self.constraints)
.finish()
}
}