use std::fmt;
use std::pin::Pin;
use futures::Stream;
use crate::types::{Message, TokenUsage};
#[derive(Debug, Clone)]
pub struct StreamError {
pub message: String,
pub is_retryable: bool,
}
impl StreamError {
#[must_use]
pub fn non_retryable(message: impl Into<String>) -> Self {
Self {
message: message.into(),
is_retryable: false,
}
}
#[must_use]
pub fn retryable(message: impl Into<String>) -> Self {
Self {
message: message.into(),
is_retryable: true,
}
}
}
impl fmt::Display for StreamError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
#[derive(Debug, Clone)]
pub enum StreamEvent {
TextDelta(String),
ThinkingDelta(String),
SignatureDelta(String),
ToolUseStart {
id: String,
name: String,
},
ToolUseInputDelta {
id: String,
delta: String,
},
ToolUseEnd {
id: String,
},
MessageComplete(Message),
Usage(TokenUsage),
Error(StreamError),
}
pub struct StreamHandle {
pub receiver: Pin<Box<dyn Stream<Item = StreamEvent> + Send>>,
}
impl fmt::Debug for StreamHandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("StreamHandle").finish_non_exhaustive()
}
}