Skip to main content

wifi_ctrl/ap/
client.rs

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)]
21/// Request client wraps the request events, awaiting oneshot channels when appropriate
22pub 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)]
72/// Broadcast events, such as a client disconnecting or connecting, may happen at any time.
73pub enum Broadcast {
74    Ready,
75    Connected(String),
76    Disconnected(String),
77    UnknownEvent(String),
78}
79
80/// Channel for broadcasting events.
81pub type BroadcastReceiver = broadcast::Receiver<Broadcast>;