Skip to main content

agentik_sdk/streaming/
events.rs

1//! Event handling system for MessageStream.
2//!
3//! This module defines the event types and handlers used by the MessageStream
4//! to manage different types of callbacks and event dispatching.
5
6use crate::types::{Message, MessageStreamEvent, AnthropicError};
7
8/// Types of events that can be handled by MessageStream.
9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub enum EventType {
11    /// Raw stream events with message snapshots
12    StreamEvent,
13    /// Text delta updates
14    Text,
15    /// Complete message received
16    Message,
17    /// Final message when stream ends
18    FinalMessage,
19    /// Error occurred
20    Error,
21    /// Stream ended
22    End,
23    /// Stream connected
24    Connect,
25    /// Stream aborted
26    Abort,
27}
28
29/// Event handlers for different types of events.
30///
31/// This enum encapsulates the different callback types that can be registered
32/// with MessageStream for handling various events during streaming.
33pub enum EventHandler {
34    /// Handler for stream events - receives event and current message snapshot
35    StreamEvent(Box<dyn Fn(&MessageStreamEvent, &Message) + Send + Sync>),
36    
37    /// Handler for text deltas - receives delta text and current accumulated text
38    Text(Box<dyn Fn(&str, &str) + Send + Sync>),
39    
40    /// Handler for complete messages
41    Message(Box<dyn Fn(&Message) + Send + Sync>),
42    
43    /// Handler for the final message when stream completes
44    FinalMessage(Box<dyn Fn(&Message) + Send + Sync>),
45    
46    /// Handler for errors
47    Error(Box<dyn Fn(&AnthropicError) + Send + Sync>),
48    
49    /// Handler for stream end
50    End(Box<dyn Fn() + Send + Sync>),
51    
52    /// Handler for connection established
53    Connect(Box<dyn Fn() + Send + Sync>),
54    
55    /// Handler for stream abort
56    Abort(Box<dyn Fn(&AnthropicError) + Send + Sync>),
57}
58
59impl std::fmt::Debug for EventHandler {
60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61        match self {
62            Self::StreamEvent(_) => f.debug_tuple("StreamEvent").field(&"<callback>").finish(),
63            Self::Text(_) => f.debug_tuple("Text").field(&"<callback>").finish(),
64            Self::Message(_) => f.debug_tuple("Message").field(&"<callback>").finish(),
65            Self::FinalMessage(_) => f.debug_tuple("FinalMessage").field(&"<callback>").finish(),
66            Self::Error(_) => f.debug_tuple("Error").field(&"<callback>").finish(),
67            Self::End(_) => f.debug_tuple("End").field(&"<callback>").finish(),
68            Self::Connect(_) => f.debug_tuple("Connect").field(&"<callback>").finish(),
69            Self::Abort(_) => f.debug_tuple("Abort").field(&"<callback>").finish(),
70        }
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use std::collections::HashMap;
78
79    #[test]
80    fn test_event_type_equality() {
81        assert_eq!(EventType::Text, EventType::Text);
82        assert_ne!(EventType::Text, EventType::Error);
83    }
84
85    #[test]
86    fn test_event_type_as_hash_key() {
87        let mut map: HashMap<EventType, Vec<String>> = HashMap::new();
88        map.insert(EventType::Text, vec!["handler1".to_string()]);
89        map.insert(EventType::Error, vec!["handler2".to_string()]);
90        
91        assert!(map.contains_key(&EventType::Text));
92        assert!(map.contains_key(&EventType::Error));
93        assert!(!map.contains_key(&EventType::Connect));
94    }
95
96    #[test]
97    fn test_event_handler_debug() {
98        let handler = EventHandler::Text(Box::new(|_, _| {}));
99        let debug_str = format!("{:?}", handler);
100        assert!(debug_str.contains("Text"));
101        assert!(debug_str.contains("<callback>"));
102    }
103}