use std::sync::Arc;
use super::reasoning::ReasoningChunk;
use super::tool_call::ToolCall;
#[derive(Debug, Clone)]
pub enum StreamEvent {
Text(String),
Reasoning(ReasoningChunk),
ToolCall(ToolCall),
Done { tokens: usize },
}
pub type StreamCallback = Arc<dyn Fn(StreamEvent) + Send + Sync>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stream_event_clone() {
let ev = StreamEvent::Text("hello".to_string());
let cloned = ev.clone();
match (ev, cloned) {
(StreamEvent::Text(a), StreamEvent::Text(b)) => assert_eq!(a, b),
_ => panic!("clone should produce same variant"),
}
}
#[test]
fn stream_event_done_carries_tokens() {
let ev = StreamEvent::Done { tokens: 42 };
match ev {
StreamEvent::Done { tokens } => assert_eq!(tokens, 42),
_ => panic!("expected Done"),
}
}
#[test]
fn stream_event_reasoning_with_chunk() {
let chunk = ReasoningChunk {
text: "weighing options".to_string(),
signature: None,
};
let ev = StreamEvent::Reasoning(chunk.clone());
match ev {
StreamEvent::Reasoning(c) => {
assert_eq!(c.text, chunk.text);
assert_eq!(c.signature, chunk.signature);
},
_ => panic!("expected Reasoning"),
}
}
#[test]
fn callback_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<StreamCallback>();
}
}