use super::*;
#[derive(Debug)]
pub(crate) enum Request {
Custom(String, oneshot::Sender<Result<String>>),
Status(oneshot::Sender<Result<Status>>),
Config(oneshot::Sender<Result<Config>>),
Enable(oneshot::Sender<Result>),
Disable(oneshot::Sender<Result>),
SetValue(String, String, oneshot::Sender<Result>),
Shutdown,
}
impl ShutdownSignal for Request {
fn is_shutdown(&self) -> bool {
matches!(self, Request::Shutdown)
}
}
#[derive(Clone)]
pub struct RequestClient {
sender: mpsc::Sender<Request>,
}
impl RequestClient {
pub(crate) fn new(sender: mpsc::Sender<Request>) -> RequestClient {
RequestClient { sender }
}
async fn request<T>(
&self,
build_request: impl FnOnce(oneshot::Sender<Result<T>>) -> Request,
) -> Result<T> {
let (response, request) = oneshot::channel();
self.sender.send(build_request(response)).await?;
request.await?
}
pub async fn send_custom(&self, custom: String) -> Result<String> {
self.request(|response| Request::Custom(custom, response))
.await
}
pub async fn get_status(&self) -> Result<Status> {
self.request(Request::Status).await
}
pub async fn get_config(&self) -> Result<Config> {
self.request(Request::Config).await
}
pub async fn enable(&self) -> Result {
self.request(Request::Enable).await
}
pub async fn disable(&self) -> Result {
self.request(Request::Disable).await
}
pub async fn set_value(&self, key: &str, value: &str) -> Result {
self.request(|response| Request::SetValue(key.into(), value.into(), response))
.await
}
pub async fn shutdown(&self) -> Result {
Ok(self.sender.send(Request::Shutdown).await?)
}
}
#[derive(Debug, Clone)]
pub enum Broadcast {
Ready,
Connected(String),
Disconnected(String),
UnknownEvent(String),
}
pub type BroadcastReceiver = broadcast::Receiver<Broadcast>;