use futures::stream::Stream;
use tokio::sync::mpsc::UnboundedReceiver;
use std::pin::Pin;
use std::task::{Context, Poll};
pub use crate::errors::StateChangeError;
#[derive(Debug)]
pub struct StateChanges {
pub(crate) rx: UnboundedReceiver<Result<Subsystem, StateChangeError>>,
}
impl Stream for StateChanges {
type Item = Result<Subsystem, StateChangeError>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
self.rx.poll_recv(cx)
}
}
#[allow(missing_docs)]
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Subsystem {
Database,
Message,
Mixer,
Options,
Output,
Partition,
Player,
Queue,
Sticker,
StoredPlaylist,
Subscription,
Update,
Other(Box<str>),
}
impl Subsystem {
pub(crate) fn from_raw_string(raw: String) -> Self {
match raw.as_str() {
"database" => Subsystem::Database,
"message" => Subsystem::Message,
"mixer" => Subsystem::Mixer,
"options" => Subsystem::Options,
"output" => Subsystem::Output,
"partition" => Subsystem::Partition,
"player" => Subsystem::Player,
"playlist" => Subsystem::Queue,
"sticker" => Subsystem::Sticker,
"stored_playlist" => Subsystem::StoredPlaylist,
"subscription" => Subsystem::Subscription,
"update" => Subsystem::Update,
_ => Subsystem::Other(raw.into()),
}
}
}