use futures::Stream;
use pin_project_lite::pin_project;
use std::pin::Pin;
use std::task::{Context, Poll};
use crate::error::A2AError;
use crate::task::TaskEvent;
pin_project! {
pub struct TaskEventStream {
#[pin]
inner: Pin<Box<dyn Stream<Item = Result<TaskEvent, A2AError>> + Send>>,
}
}
impl TaskEventStream {
pub fn new(inner: Pin<Box<dyn Stream<Item = Result<TaskEvent, A2AError>> + Send>>) -> Self {
Self { inner }
}
}
impl Stream for TaskEventStream {
type Item = Result<TaskEvent, A2AError>;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
self.project().inner.poll_next(cx)
}
}
pub fn parse_sse_event(data: &str) -> Result<TaskEvent, A2AError> {
serde_json::from_str(data)
.map_err(|e| A2AError::StreamingError(format!("Failed to parse SSE event: {e}")))
}
pub mod event_types {
pub const STATE_CHANGED: &str = "state_changed";
pub const MESSAGE_ADDED: &str = "message_added";
pub const ARTIFACT_ADDED: &str = "artifact_added";
pub const ARTIFACT_CHUNK: &str = "artifact_chunk";
pub const DONE: &str = "done";
}