use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum Api {
#[serde(rename = "openai-completions")]
OpenAiCompletions,
#[serde(rename = "openai-responses")]
OpenAiResponses,
#[serde(rename = "openrouter")]
OpenRouter,
#[serde(rename = "openai-codex-responses")]
OpenAiCodexResponses,
#[serde(rename = "azure-openai-responses")]
AzureOpenAiResponses,
#[serde(rename = "anthropic-messages")]
AnthropicMessages,
#[serde(rename = "bedrock-converse-stream")]
BedrockConverseStream,
#[serde(rename = "google-generative-ai")]
GoogleGenerativeAi,
#[serde(rename = "google-gemini-cli")]
GoogleGeminiCli,
#[serde(rename = "google-vertex")]
GoogleVertex,
#[serde(rename = "ollama-chat")]
OllamaChat,
#[serde(rename = "cursor-agent")]
CursorAgent,
#[serde(rename = "gitlab-duo")]
GitLabDuo,
#[serde(rename = "gitlab-duo-agent")]
GitLabDuoAgent,
#[serde(rename = "devin-agent")]
DevinAgent,
}
impl fmt::Display for Api {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Api::OpenAiCompletions => "openai-completions",
Api::OpenAiResponses => "openai-responses",
Api::OpenRouter => "openrouter",
Api::OpenAiCodexResponses => "openai-codex-responses",
Api::AzureOpenAiResponses => "azure-openai-responses",
Api::AnthropicMessages => "anthropic-messages",
Api::BedrockConverseStream => "bedrock-converse-stream",
Api::GoogleGenerativeAi => "google-generative-ai",
Api::GoogleGeminiCli => "google-gemini-cli",
Api::GoogleVertex => "google-vertex",
Api::OllamaChat => "ollama-chat",
Api::CursorAgent => "cursor-agent",
Api::GitLabDuo => "gitlab-duo",
Api::GitLabDuoAgent => "gitlab-duo-agent",
Api::DevinAgent => "devin-agent",
};
f.write_str(s)
}
}
impl Api {
pub fn from_kebab_str(s: &str) -> Option<Self> {
Some(match s {
"openai-completions" => Api::OpenAiCompletions,
"openai-responses" => Api::OpenAiResponses,
"openrouter" => Api::OpenRouter,
"openai-codex-responses" => Api::OpenAiCodexResponses,
"azure-openai-responses" => Api::AzureOpenAiResponses,
"anthropic-messages" => Api::AnthropicMessages,
"bedrock-converse-stream" => Api::BedrockConverseStream,
"google-generative-ai" => Api::GoogleGenerativeAi,
"google-gemini-cli" => Api::GoogleGeminiCli,
"google-vertex" => Api::GoogleVertex,
"ollama-chat" => Api::OllamaChat,
"cursor-agent" => Api::CursorAgent,
"gitlab-duo" => Api::GitLabDuo,
"gitlab-duo-agent" => Api::GitLabDuoAgent,
"devin-agent" => Api::DevinAgent,
_ => return None,
})
}
}