use crate::protocol::{
ContentGenerationKind as Cg, Operation, OperationKey, OperationKind, Provider,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RoutingDecision {
Passthrough,
TransformTo(OperationKey),
Local,
Unsupported,
}
pub type RouteList = Vec<(OperationKey, RoutingDecision)>;
fn key(operation: Operation, kind: OperationKind) -> OperationKey {
OperationKey::try_new(operation, kind).expect("channel route must use a consistent operation")
}
pub fn pass(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Passthrough)
}
pub fn xform(
operation: Operation,
kind: OperationKind,
d_op: Operation,
d_kind: OperationKind,
) -> (OperationKey, RoutingDecision) {
(
key(operation, kind),
RoutingDecision::TransformTo(key(d_op, d_kind)),
)
}
pub fn unsupported(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Unsupported)
}
pub fn local(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Local)
}
pub fn responses_ws_to(d_kind: OperationKind) -> RouteList {
use Operation::{GenerateContent, StreamGenerateContent};
vec![
xform(
GenerateContent,
cg(Cg::OpenAiResponsesWebSocket),
StreamGenerateContent,
d_kind,
),
xform(
StreamGenerateContent,
cg(Cg::OpenAiResponsesWebSocket),
StreamGenerateContent,
d_kind,
),
]
}
pub fn cg(k: Cg) -> OperationKind {
OperationKind::ContentGeneration(k)
}
pub fn pv(p: Provider) -> OperationKind {
OperationKind::Provider(p)
}