use std::fmt;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AgentKind {
Codex,
Pi,
Claude,
}
impl fmt::Display for AgentKind {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::Codex => "codex",
Self::Pi => "pi",
Self::Claude => "claude",
})
}
}
impl FromStr for AgentKind {
type Err = AgentParseError;
fn from_str(value: &str) -> Result<Self, Self::Err> {
match value {
"codex" => Ok(Self::Codex),
"pi" => Ok(Self::Pi),
"claude" => Ok(Self::Claude),
unknown => Err(AgentParseError::Unknown(unknown.to_owned())),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Scope {
Global,
Project,
}
impl fmt::Display for Scope {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::Global => "global",
Self::Project => "project",
})
}
}
impl FromStr for Scope {
type Err = AgentParseError;
fn from_str(value: &str) -> Result<Self, Self::Err> {
match value {
"global" => Ok(Self::Global),
"project" => Ok(Self::Project),
unknown => Err(AgentParseError::UnknownScope(unknown.to_owned())),
}
}
}
#[derive(Debug, Error, PartialEq, Eq)]
pub enum AgentParseError {
#[error("unknown agent: {0}")]
Unknown(String),
#[error("unknown scope: {0}")]
UnknownScope(String),
}