use crate::error::Error;
use crate::protocol::v2::manifest::ApiStyle;
use crate::protocol::ProtocolError;
use super::provider_contract::ProviderContract;
const ANTHROPIC_MESSAGES_CONTRACT: &str = include_str!("embedded/anthropic-messages.contract.yaml");
const GEMINI_GENERATE_CONTRACT: &str = include_str!("embedded/gemini-generate.contract.yaml");
fn parse_contract(yaml: &str) -> Result<ProviderContract, Error> {
serde_yaml::from_str(yaml).map_err(|e| {
Error::Protocol(ProtocolError::ValidationError(format!(
"invalid ProviderContract YAML: {e}"
)))
})
}
pub fn anthropic_messages_contract() -> Result<ProviderContract, Error> {
parse_contract(ANTHROPIC_MESSAGES_CONTRACT)
}
pub fn gemini_generate_contract() -> Result<ProviderContract, Error> {
parse_contract(GEMINI_GENERATE_CONTRACT)
}
pub fn contract_for_api_style(style: ApiStyle) -> Result<ProviderContract, Error> {
match style {
ApiStyle::AnthropicMessages => anthropic_messages_contract(),
ApiStyle::GeminiGenerate => gemini_generate_contract(),
ApiStyle::OpenAiCompatible | ApiStyle::Custom => {
Err(Error::Protocol(ProtocolError::ValidationError(format!(
"no embedded ProviderContract for api_style {style}"
))))
}
}
}