Skip to main content

gproxy_protocol/adapt/generate/stream/fanout/
bridge.rs

1use super::*;
2use crate::transform::generate::{
3    chat_responses::stream as hr, claude_chat::stream as ch, claude_gemini::stream as cg,
4    gemini_responses::stream as gr,
5};
6
7mod sealed {
8    pub trait Edge {}
9}
10
11/// The four single-result upstream edges that can serve a multi-candidate client.
12pub trait FanoutBridge: StreamBridge + sealed::Edge {
13    fn reserve(&mut self, role: IdentityRole, ids: &BTreeSet<String>)
14    -> Result<(), TransformError>;
15}
16
17macro_rules! edge {
18    ($ty:ty) => {
19        impl sealed::Edge for $ty {}
20        impl FanoutBridge for $ty {
21            fn reserve(
22                &mut self,
23                role: IdentityRole,
24                ids: &BTreeSet<String>,
25            ) -> Result<(), TransformError> {
26                self.reserve_external_ids(role, ids)
27            }
28        }
29    };
30}
31edge!(ch::ClaudeToChatStream);
32edge!(cg::ClaudeToGeminiStream);
33edge!(hr::ResponsesToChatStream);
34
35impl sealed::Edge for gr::ResponsesToGeminiStream {}
36impl FanoutBridge for gr::ResponsesToGeminiStream {
37    fn reserve(
38        &mut self,
39        role: IdentityRole,
40        ids: &BTreeSet<String>,
41    ) -> Result<(), TransformError> {
42        self.reserve_external_ids(role, ids)
43    }
44}