#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum StreamState {
#[default]
Idle,
Streaming,
Completed,
Error(String),
Aborted,
}
impl StreamState {
pub fn is_idle(&self) -> bool {
matches!(self, StreamState::Idle)
}
pub fn is_streaming(&self) -> bool {
matches!(self, StreamState::Streaming)
}
pub fn is_completed(&self) -> bool {
matches!(self, StreamState::Completed)
}
pub fn is_error(&self) -> bool {
matches!(self, StreamState::Error(_))
}
pub fn is_aborted(&self) -> bool {
matches!(self, StreamState::Aborted)
}
pub fn error(&self) -> Option<&str> {
match self {
StreamState::Error(msg) => Some(msg),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StreamStatus<T> {
state: StreamState,
buffer: Option<T>,
}
impl<T> StreamStatus<T> {
pub fn idle() -> Self {
Self {
state: StreamState::Idle,
buffer: None,
}
}
pub fn streaming(buffer: T) -> Self {
Self {
state: StreamState::Streaming,
buffer: Some(buffer),
}
}
pub fn completed(buffer: T) -> Self {
Self {
state: StreamState::Completed,
buffer: Some(buffer),
}
}
pub fn error(message: impl Into<String>, buffer: T) -> Self {
Self {
state: StreamState::Error(message.into()),
buffer: Some(buffer),
}
}
pub fn aborted(buffer: T) -> Self {
Self {
state: StreamState::Aborted,
buffer: Some(buffer),
}
}
pub fn state(&self) -> &StreamState {
&self.state
}
pub fn buffer(&self) -> Option<&T> {
self.buffer.as_ref()
}
pub fn is_idle(&self) -> bool {
self.state.is_idle()
}
pub fn is_streaming(&self) -> bool {
self.state.is_streaming()
}
pub fn is_completed(&self) -> bool {
self.state.is_completed()
}
pub fn is_error(&self) -> bool {
self.state.is_error()
}
pub fn is_aborted(&self) -> bool {
self.state.is_aborted()
}
pub fn error_message(&self) -> Option<&str> {
self.state.error()
}
}
impl<T> Default for StreamStatus<T> {
fn default() -> Self {
Self::idle()
}
}