use serde::{Deserialize, Serialize};
use crate::schema::ProviderCapabilities;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, schemars::JsonSchema)]
pub enum WireProtocol {
#[serde(rename = "anthropic")]
Anthropic,
#[serde(rename = "openai-chat", alias = "openai_chat", alias = "openai")]
OpenAiChat,
#[serde(rename = "openai-responses", alias = "openai_responses")]
OpenAiResponses,
#[serde(rename = "gemini")]
Gemini,
}
impl WireProtocol {
#[must_use]
pub const fn as_tag(self) -> &'static str {
match self {
Self::Anthropic => "anthropic",
Self::OpenAiChat => "openai-chat",
Self::OpenAiResponses => "openai-responses",
Self::Gemini => "gemini",
}
}
#[must_use]
pub fn from_tag(tag: &str) -> Option<Self> {
match tag {
"anthropic" => Some(Self::Anthropic),
"openai-chat" | "openai_chat" | "openai" => Some(Self::OpenAiChat),
"openai-responses" | "openai_responses" => Some(Self::OpenAiResponses),
"gemini" => Some(Self::Gemini),
_ => None,
}
}
#[must_use]
pub const fn schema_capabilities(self) -> ProviderCapabilities {
match self {
Self::Anthropic => ProviderCapabilities::anthropic(),
Self::OpenAiChat | Self::OpenAiResponses => ProviderCapabilities::openai(),
Self::Gemini => ProviderCapabilities::gemini(),
}
}
}
impl std::fmt::Display for WireProtocol {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_tag())
}
}