va-ai-api-bridge 0.1.7

Protocol translation primitives for AI API request and response shapes.
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::{DecodeState, Extensions, Result, UniversalEvent, UniversalItem, WireProtocol};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BridgeContext {
    pub profile_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub launch_id: Option<String>,
    pub source_protocol: WireProtocol,
    pub target_protocol: WireProtocol,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub provider_settings: Option<Value>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub history: Option<BridgeHistory>,
    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
    pub extensions: Extensions,
}

#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BridgeHistory {
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub items: Vec<UniversalItem>,
    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
    pub extensions: Extensions,
}

#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdapterStreamState {
    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
    pub extensions: Extensions,
    #[serde(default)]
    pub translator_state: DecodeState,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AdapterStreamStep {
    UseTargetTranslator,
    Events(Vec<UniversalEvent>),
}

pub trait ProviderAdapter {
    fn prepare_request(&mut self, _ctx: &BridgeContext, request: Value) -> Result<Value> {
        Ok(request)
    }

    fn map_response(
        &mut self,
        _ctx: &BridgeContext,
        _response: &Value,
    ) -> Result<Option<Vec<UniversalEvent>>> {
        Ok(None)
    }

    fn map_stream_chunk(
        &mut self,
        _ctx: &BridgeContext,
        _chunk: &Value,
        _state: &mut AdapterStreamState,
    ) -> Result<AdapterStreamStep> {
        Ok(AdapterStreamStep::UseTargetTranslator)
    }
}