use futures::{Stream, StreamExt};
use super::inference_types::StreamEvent;
pub(crate) const ENDED_WITHOUT_RESULT: &str = "inference ended without a result: the server dropped this request's stream \
before it finished or reported an error";
pub(crate) fn terminated<S>(events: S) -> impl Stream<Item = StreamEvent>
where
S: Stream<Item = StreamEvent> + Unpin,
{
futures::stream::unfold(
(events, false, false),
|(mut events, seen_terminal, synthesized)| async move {
if synthesized {
return None;
}
match events.next().await {
Some(event) => {
let terminal =
matches!(event, StreamEvent::Done { .. } | StreamEvent::Error(_));
Some((event, (events, seen_terminal || terminal, false)))
}
None if seen_terminal => None,
None => Some((
StreamEvent::Error(ENDED_WITHOUT_RESULT.to_string()),
(events, true, true),
)),
}
},
)
}
#[cfg(test)]
#[path = "stream_terminal_tests.rs"]
mod tests;