gemini_live_api/client/
handlers.rs1use 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}