Skip to main content

systemprompt_identifiers/
agent.rs

1//! Agent identity newtypes: opaque [`AgentId`] (UUID-backed) and validated
2//! [`AgentName`] (non-empty, reserves `"unknown"`).
3
4crate::define_id!(AgentId, generate, schema);
5
6use crate::error::IdValidationError;
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, schemars::JsonSchema)]
9#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
10#[cfg_attr(feature = "sqlx", sqlx(transparent))]
11#[serde(transparent)]
12pub struct AgentName(String);
13
14impl AgentName {
15    pub fn try_new(name: impl Into<String>) -> Result<Self, IdValidationError> {
16        let name = name.into();
17        if name.is_empty() {
18            return Err(IdValidationError::empty("AgentName"));
19        }
20        if name.eq_ignore_ascii_case("unknown") {
21            return Err(IdValidationError::invalid(
22                "AgentName",
23                "'unknown' is reserved for error detection",
24            ));
25        }
26        Ok(Self(name))
27    }
28
29    #[allow(clippy::expect_used)]
30    pub fn new(name: impl Into<String>) -> Self {
31        Self::try_new(name).expect("AgentName validation failed")
32    }
33
34    pub fn as_str(&self) -> &str {
35        &self.0
36    }
37
38    pub fn system() -> Self {
39        Self("system".to_string())
40    }
41}
42
43crate::__define_id_validated_conversions!(AgentName);
44crate::__define_id_common!(AgentName);