use http::Method;
use crate::operation::{Operation, OperationKind};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Seg {
Lit(&'static str),
Param(&'static str),
ParamAction(&'static str, &'static str),
Rest(&'static str),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PathPattern(pub &'static [Seg]);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StreamDetect {
Never,
BodyFlag(&'static str),
BodyValue(&'static str, &'static str),
BodyFlagOrMultipart(&'static str),
Always,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StreamFraming {
Sse,
WebSocket,
JsonArray,
}
#[derive(Debug, Clone, Copy)]
pub struct Ingress {
pub method: &'static Method,
pub pattern: PathPattern,
pub kind: OperationKind,
pub stream: StreamDetect,
pub framing: StreamFraming,
pub upgrade: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SettleMode {
Free,
OnResponse,
OnSessionEnd,
OnCompletedStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Affinity {
None,
Session,
Resource(&'static str),
}
#[derive(Debug, Clone, Copy)]
pub struct OperationSpec {
pub ingress: &'static [Ingress],
pub settle: SettleMode,
pub affinity: Affinity,
}
#[derive(Debug)]
pub struct Matched {
pub operation: Operation,
pub kind: OperationKind,
pub stream: StreamDetect,
pub framing: StreamFraming,
pub upgrade: bool,
pub params: Vec<(&'static str, String)>,
}
pub const fn default_framing(kind: OperationKind, upgrade: bool) -> StreamFraming {
if upgrade {
return StreamFraming::WebSocket;
}
match kind {
OperationKind::ContentGeneration(
crate::operation::ContentGenerationKind::GeminiGenerateContent,
) => StreamFraming::JsonArray,
OperationKind::ContentGeneration(
crate::operation::ContentGenerationKind::OpenAiResponsesWebSocket,
) => StreamFraming::WebSocket,
OperationKind::ContentGeneration(
crate::operation::ContentGenerationKind::OpenAiChat
| crate::operation::ContentGenerationKind::OpenAiResponses
| crate::operation::ContentGenerationKind::ClaudeMessages,
)
| OperationKind::Family(_) => StreamFraming::Sse,
}
}
pub const fn streaming_sibling(operation: Operation) -> Option<Operation> {
match operation {
Operation::GenerateContent => Some(Operation::StreamGenerateContent),
Operation::ListModels
| Operation::GetModel
| Operation::CountTokens
| Operation::SummarizeMemory
| Operation::StreamGenerateContent
| Operation::GuardianReview
| Operation::GuardianClassify
| Operation::CompactContent
| Operation::CreateConversation
| Operation::CreateEmbedding
| Operation::BatchCreateEmbedding
| Operation::Rerank
| Operation::WebSearch
| Operation::CreateImage
| Operation::EditImage
| Operation::CreateSpeech
| Operation::CreateTranscription
| Operation::CreateTranslation
| Operation::CreateFile
| Operation::ListFiles
| Operation::RetrieveFile
| Operation::RetrieveFileContent
| Operation::DeleteFile
| Operation::CreateVideo
| Operation::RetrieveVideo
| Operation::ListVideos
| Operation::DeleteVideo
| Operation::DownloadVideoContent
| Operation::RemixVideo
| Operation::CreateVideoCharacter
| Operation::GetVideoCharacter
| Operation::EditVideo
| Operation::ExtendVideo
| Operation::CreateRealtimeCall
| Operation::ConnectRealtime => None,
}
}
impl Operation {
pub fn spec(self) -> &'static OperationSpec {
crate::specs::spec(self)
}
}