gemini_live_api/client/
handlers.rs

1use crate::types::{BidiGenerateContentServerContent, UsageMetadata};
2use std::collections::HashMap;
3use std::future::Future;
4use std::marker::PhantomData;
5use std::pin::Pin;
6use std::sync::Arc;
7
8#[derive(Debug, Clone)]
9pub struct ServerContentContext {
10    pub content: BidiGenerateContentServerContent,
11}
12
13#[derive(Debug, Clone)]
14pub struct UsageMetadataContext {
15    pub metadata: UsageMetadata,
16}
17
18pub trait EventHandlerSimple<Args, S_CLIENT: Clone + Send + Sync + 'static>:
19    Send + Sync + 'static
20{
21    fn call(
22        &self,
23        args: Args,
24        state: Arc<S_CLIENT>,
25    ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>;
26}
27
28impl<F, Fut, Args, S_CLIENT> EventHandlerSimple<Args, S_CLIENT> for F
29where
30    F: Fn(Args, Arc<S_CLIENT>) -> Fut + Send + Sync + 'static,
31    S_CLIENT: Clone + Send + Sync + 'static,
32    Fut: Future<Output = ()> + Send + 'static,
33    Args: Send + 'static,
34{
35    fn call(
36        &self,
37        args: Args,
38        state: Arc<S_CLIENT>,
39    ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>> {
40        Box::pin(self(args, state))
41    }
42}
43
44pub trait ToolHandler<S_CLIENT: Clone + Send + Sync + 'static>: Send + Sync + 'static {
45    fn call(
46        &self,
47        args: Option<serde_json::Value>,
48        state: Arc<S_CLIENT>,
49    ) -> Pin<Box<dyn Future<Output = Result<serde_json::Value, String>> + Send + 'static>>;
50}
51
52impl<F, Fut, S_CLIENT> ToolHandler<S_CLIENT> for F
53where
54    F: Fn(Option<serde_json::Value>, Arc<S_CLIENT>) -> Fut + Send + Sync + 'static,
55    S_CLIENT: Clone + Send + Sync + 'static,
56    Fut: Future<Output = Result<serde_json::Value, String>> + Send + 'static,
57{
58    fn call(
59        &self,
60        args: Option<serde_json::Value>,
61        state: Arc<S_CLIENT>,
62    ) -> Pin<Box<dyn Future<Output = Result<serde_json::Value, String>> + Send + 'static>> {
63        Box::pin(self(args, state))
64    }
65}
66
67pub(crate) struct Handlers<S_CLIENT: Clone + Send + Sync + 'static> {
68    pub(crate) on_server_content:
69        Option<Arc<dyn EventHandlerSimple<ServerContentContext, S_CLIENT>>>,
70    pub(crate) on_usage_metadata:
71        Option<Arc<dyn EventHandlerSimple<UsageMetadataContext, S_CLIENT>>>,
72    pub(crate) tool_handlers: HashMap<String, Arc<dyn ToolHandler<S_CLIENT>>>,
73    _phantom_s: PhantomData<S_CLIENT>,
74}
75
76impl<S_CLIENT: Clone + Send + Sync + 'static> Default for Handlers<S_CLIENT> {
77    fn default() -> Self {
78        Self {
79            on_server_content: None,
80            on_usage_metadata: None,
81            tool_handlers: HashMap::new(),
82            _phantom_s: PhantomData,
83        }
84    }
85}