1use super::*;
2
3#[derive(Debug)]
4pub(crate) enum Request {
5 Custom(String, oneshot::Sender<Result<String>>),
6 Status(oneshot::Sender<Result<Status>>),
7 Config(oneshot::Sender<Result<Config>>),
8 Enable(oneshot::Sender<Result>),
9 Disable(oneshot::Sender<Result>),
10 SetValue(String, String, oneshot::Sender<Result>),
11 Shutdown,
12}
13
14impl ShutdownSignal for Request {
15 fn is_shutdown(&self) -> bool {
16 matches!(self, Request::Shutdown)
17 }
18}
19
20#[derive(Clone)]
21pub struct RequestClient {
23 sender: mpsc::Sender<Request>,
24}
25
26impl RequestClient {
27 pub(crate) fn new(sender: mpsc::Sender<Request>) -> RequestClient {
28 RequestClient { sender }
29 }
30
31 async fn request<T>(
32 &self,
33 build_request: impl FnOnce(oneshot::Sender<Result<T>>) -> Request,
34 ) -> Result<T> {
35 let (response, request) = oneshot::channel();
36 self.sender.send(build_request(response)).await?;
37 request.await?
38 }
39
40 pub async fn send_custom(&self, custom: String) -> Result<String> {
41 self.request(|response| Request::Custom(custom, response))
42 .await
43 }
44
45 pub async fn get_status(&self) -> Result<Status> {
46 self.request(Request::Status).await
47 }
48
49 pub async fn get_config(&self) -> Result<Config> {
50 self.request(Request::Config).await
51 }
52
53 pub async fn enable(&self) -> Result {
54 self.request(Request::Enable).await
55 }
56
57 pub async fn disable(&self) -> Result {
58 self.request(Request::Disable).await
59 }
60
61 pub async fn set_value(&self, key: &str, value: &str) -> Result {
62 self.request(|response| Request::SetValue(key.into(), value.into(), response))
63 .await
64 }
65
66 pub async fn shutdown(&self) -> Result {
67 Ok(self.sender.send(Request::Shutdown).await?)
68 }
69}
70
71#[derive(Debug, Clone)]
72pub enum Broadcast {
74 Ready,
75 Connected(String),
76 Disconnected(String),
77 UnknownEvent(String),
78}
79
80pub type BroadcastReceiver = broadcast::Receiver<Broadcast>;