va-ai-api-bridge 0.1.7

Protocol translation primitives for AI API request and response shapes.
Documentation
use std::fmt;
use std::str::FromStr;

use serde::{Deserialize, Serialize};

use crate::{ApiBridgeError, Result};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum WireProtocol {
    #[serde(rename = "openai-responses")]
    OpenAiResponses,
    #[serde(rename = "openai-chat")]
    OpenAiChat,
    #[serde(rename = "anthropic-messages")]
    AnthropicMessages,
    #[serde(rename = "gemini-generate-content")]
    GeminiGenerateContent,
}

impl WireProtocol {
    pub fn as_str(self) -> &'static str {
        match self {
            Self::OpenAiResponses => "openai-responses",
            Self::OpenAiChat => "openai-chat",
            Self::AnthropicMessages => "anthropic-messages",
            Self::GeminiGenerateContent => "gemini-generate-content",
        }
    }
}

impl fmt::Display for WireProtocol {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str(self.as_str())
    }
}

impl FromStr for WireProtocol {
    type Err = ApiBridgeError;

    fn from_str(value: &str) -> Result<Self> {
        match value {
            "openai-responses" => Ok(Self::OpenAiResponses),
            "openai-chat" => Ok(Self::OpenAiChat),
            "anthropic-messages" => Ok(Self::AnthropicMessages),
            "gemini-generate-content" => Ok(Self::GeminiGenerateContent),
            other => Err(ApiBridgeError::unsupported_protocol(other)),
        }
    }
}