use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::principal::PrincipalSummary;
use crate::typed_id::AgentIdentityId;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "lowercase")]
pub enum AgentIdentityStatus {
Active,
Archived,
Deleted,
}
impl std::fmt::Display for AgentIdentityStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AgentIdentityStatus::Active => write!(f, "active"),
AgentIdentityStatus::Archived => write!(f, "archived"),
AgentIdentityStatus::Deleted => write!(f, "deleted"),
}
}
}
impl From<&str> for AgentIdentityStatus {
fn from(value: &str) -> Self {
match value {
"archived" => Self::Archived,
"deleted" => Self::Deleted,
_ => Self::Active,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct AgentIdentity {
#[serde(rename = "id")]
#[cfg_attr(feature = "openapi", schema(value_type = String, example = "identity_01933b5a000070008000000000000001"))]
pub id: AgentIdentityId,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub principal: Option<PrincipalSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_owner: Option<PrincipalSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
pub status: AgentIdentityStatus,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
}