use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, schemars::JsonSchema)]
pub enum ApiSurface {
#[serde(rename = "anthropic")]
Anthropic,
#[serde(rename = "openai")]
OpenAi,
#[serde(rename = "gemini")]
Gemini,
#[serde(rename = "backend")]
Backend,
}
impl ApiSurface {
#[must_use]
pub const fn as_tag(self) -> &'static str {
match self {
Self::Anthropic => "anthropic",
Self::OpenAi => "openai",
Self::Gemini => "gemini",
Self::Backend => "backend",
}
}
#[must_use]
pub fn from_tag(tag: &str) -> Option<Self> {
match tag {
"anthropic" => Some(Self::Anthropic),
"openai" => Some(Self::OpenAi),
"gemini" => Some(Self::Gemini),
"backend" => Some(Self::Backend),
_ => None,
}
}
#[must_use]
pub const fn is_advertised(self) -> bool {
!matches!(self, Self::Backend)
}
}
impl std::fmt::Display for ApiSurface {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_tag())
}
}