use crate::event::AISdkEvent;
use uuid::Uuid;
#[derive(Debug)]
pub struct AISdkStreamBuilder {
message_id: Uuid,
text_id: Option<Uuid>,
reasoning_id: Option<Uuid>,
}
impl AISdkStreamBuilder {
pub fn new() -> Self {
Self {
message_id: Uuid::new_v4(),
text_id: None,
reasoning_id: None,
}
}
pub fn start(&self) -> AISdkEvent {
AISdkEvent::Start {
message_id: self.message_id,
}
}
pub fn text_start(&mut self) -> AISdkEvent {
let id = Uuid::new_v4();
self.text_id = Some(id);
AISdkEvent::TextStart { id }
}
pub fn text_delta(&self, delta: impl Into<String>) -> Option<AISdkEvent> {
self.text_id.map(|id| AISdkEvent::TextDelta {
id,
delta: delta.into(),
})
}
pub fn text_end(&mut self) -> Option<AISdkEvent> {
self.text_id.take().map(|id| AISdkEvent::TextEnd { id })
}
pub fn reasoning_start(&mut self) -> AISdkEvent {
let id = Uuid::new_v4();
self.reasoning_id = Some(id);
AISdkEvent::ReasoningStart { id }
}
pub fn reasoning_delta(&self, delta: impl Into<String>) -> Option<AISdkEvent> {
self.reasoning_id.map(|id| AISdkEvent::ReasoningDelta {
id,
delta: delta.into(),
})
}
pub fn reasoning_end(&mut self) -> Option<AISdkEvent> {
self.reasoning_id
.take()
.map(|id| AISdkEvent::ReasoningEnd { id })
}
pub fn finish(&self) -> AISdkEvent {
AISdkEvent::Finish
}
pub fn done(&self) -> AISdkEvent {
AISdkEvent::Done
}
}
impl Default for AISdkStreamBuilder {
fn default() -> Self {
Self::new()
}
}