Skip to main content

va_ai_api_bridge/
protocol.rs

1use std::fmt;
2use std::str::FromStr;
3
4use serde::{Deserialize, Serialize};
5
6use crate::{ApiBridgeError, Result};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub enum WireProtocol {
10    #[serde(rename = "openai-responses")]
11    OpenAiResponses,
12    #[serde(rename = "openai-chat")]
13    OpenAiChat,
14    #[serde(rename = "anthropic-messages")]
15    AnthropicMessages,
16    #[serde(rename = "gemini-generate-content")]
17    GeminiGenerateContent,
18}
19
20impl WireProtocol {
21    pub fn as_str(self) -> &'static str {
22        match self {
23            Self::OpenAiResponses => "openai-responses",
24            Self::OpenAiChat => "openai-chat",
25            Self::AnthropicMessages => "anthropic-messages",
26            Self::GeminiGenerateContent => "gemini-generate-content",
27        }
28    }
29}
30
31impl fmt::Display for WireProtocol {
32    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33        f.write_str(self.as_str())
34    }
35}
36
37impl FromStr for WireProtocol {
38    type Err = ApiBridgeError;
39
40    fn from_str(value: &str) -> Result<Self> {
41        match value {
42            "openai-responses" => Ok(Self::OpenAiResponses),
43            "openai-chat" => Ok(Self::OpenAiChat),
44            "anthropic-messages" => Ok(Self::AnthropicMessages),
45            "gemini-generate-content" => Ok(Self::GeminiGenerateContent),
46            other => Err(ApiBridgeError::unsupported_protocol(other)),
47        }
48    }
49}