use super::*;
pub type ScanResults = Arc<Vec<ScanResult>>;
#[derive(Debug)]
pub enum SelectResult {
Success,
WrongPsk,
NotFound,
AlreadyConnected,
}
use std::fmt;
impl fmt::Display for SelectResult {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match self {
SelectResult::Success => "success",
SelectResult::WrongPsk => "wrong_psk",
SelectResult::NotFound => "network_not_found",
SelectResult::AlreadyConnected => "already_connected",
};
write!(f, "{s}")
}
}
#[derive(Debug)]
pub(crate) enum RemoveNetwork {
Id(usize),
All,
}
#[derive(Debug)]
pub(crate) enum Request {
Custom(String, oneshot::Sender<Result<String>>),
Status(oneshot::Sender<Result<Status>>),
Networks(oneshot::Sender<Result<Vec<NetworkResult>>>),
Scan(oneshot::Sender<Result<ScanResults>>),
AddNetwork(oneshot::Sender<Result<usize>>),
SetNetwork(usize, SetNetwork, oneshot::Sender<Result>),
SaveConfig(oneshot::Sender<Result>),
ReloadConfig(oneshot::Sender<Result>),
RemoveNetwork(RemoveNetwork, oneshot::Sender<Result>),
SelectNetwork(usize, oneshot::Sender<Result<SelectResult>>),
Shutdown,
}
impl ShutdownSignal for Request {
fn is_shutdown(&self) -> bool {
matches!(self, Request::Shutdown)
}
}
#[derive(Debug)]
pub(crate) enum SetNetwork {
Ssid(String),
Bssid(Bssid),
Psk(Psk),
KeyMgmt(KeyMgmt),
}
#[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_scan(&self) -> Result<Arc<Vec<ScanResult>>> {
self.request(Request::Scan).await
}
pub async fn get_networks(&self) -> Result<Vec<NetworkResult>> {
self.request(Request::Networks).await
}
pub async fn get_status(&self) -> Result<Status> {
self.request(Request::Status).await
}
pub async fn add_network(&self) -> Result<usize> {
self.request(Request::AddNetwork).await
}
pub async fn set_network_psk(&self, network_id: usize, psk: Psk) -> Result {
self.request(|response| Request::SetNetwork(network_id, SetNetwork::Psk(psk), response))
.await
}
pub async fn set_network_ssid(&self, network_id: usize, ssid: String) -> Result {
self.request(|response| Request::SetNetwork(network_id, SetNetwork::Ssid(ssid), response))
.await
}
pub async fn set_network_bssid(&self, network_id: usize, bssid: Bssid) -> Result {
self.request(|response| Request::SetNetwork(network_id, SetNetwork::Bssid(bssid), response))
.await
}
pub async fn set_network_keymgmt(&self, network_id: usize, mgmt: KeyMgmt) -> Result {
self.request(|response| {
Request::SetNetwork(network_id, SetNetwork::KeyMgmt(mgmt), response)
})
.await
}
pub async fn save_config(&self) -> Result {
self.request(Request::SaveConfig).await
}
pub async fn reload_config(&self) -> Result {
self.request(Request::ReloadConfig).await
}
pub async fn remove_network(&self, id: usize) -> Result {
self.request(|response| Request::RemoveNetwork(RemoveNetwork::Id(id), response))
.await
}
pub async fn remove_all_networks(&self) -> Result {
self.request(|response| Request::RemoveNetwork(RemoveNetwork::All, response))
.await
}
pub async fn select_network(&self, network_id: usize) -> Result<SelectResult> {
self.request(|response| Request::SelectNetwork(network_id, response))
.await
}
pub async fn shutdown(&self) -> Result {
self.sender.send(Request::Shutdown).await?;
Ok(())
}
}
#[derive(Debug, Clone)]
pub enum Broadcast {
Connected,
Disconnected,
NetworkNotFound,
WrongPsk,
Ready,
Unknown(String),
}
pub type BroadcastReceiver = broadcast::Receiver<Broadcast>;