Skip to main content

va_ai_api_bridge/
adapter.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::{DecodeState, Extensions, Result, UniversalEvent, UniversalItem, WireProtocol};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct BridgeContext {
9    pub profile_id: String,
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub launch_id: Option<String>,
12    pub source_protocol: WireProtocol,
13    pub target_protocol: WireProtocol,
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub provider_settings: Option<Value>,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub history: Option<BridgeHistory>,
18    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
19    pub extensions: Extensions,
20}
21
22#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct BridgeHistory {
25    #[serde(default, skip_serializing_if = "Vec::is_empty")]
26    pub items: Vec<UniversalItem>,
27    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
28    pub extensions: Extensions,
29}
30
31#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct AdapterStreamState {
34    #[serde(default, skip_serializing_if = "Extensions::is_empty")]
35    pub extensions: Extensions,
36    #[serde(default)]
37    pub translator_state: DecodeState,
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub enum AdapterStreamStep {
43    UseTargetTranslator,
44    Events(Vec<UniversalEvent>),
45}
46
47pub trait ProviderAdapter {
48    fn prepare_request(&mut self, _ctx: &BridgeContext, request: Value) -> Result<Value> {
49        Ok(request)
50    }
51
52    fn map_response(
53        &mut self,
54        _ctx: &BridgeContext,
55        _response: &Value,
56    ) -> Result<Option<Vec<UniversalEvent>>> {
57        Ok(None)
58    }
59
60    fn map_stream_chunk(
61        &mut self,
62        _ctx: &BridgeContext,
63        _chunk: &Value,
64        _state: &mut AdapterStreamState,
65    ) -> Result<AdapterStreamStep> {
66        Ok(AdapterStreamStep::UseTargetTranslator)
67    }
68}