use num_traits::FromPrimitive;
use zbus::{zvariant::OwnedObjectPath, Connection};
use crate::{
types::{AccessPointCapabilityFlags, AccessPointMode, AccessPointSecurityFlags},
Error,
};
#[derive(Clone, Debug)]
pub struct AccessPoint {
pub(crate) zbus: Connection,
pub(crate) path: OwnedObjectPath,
}
crate::zproxy_pathed!(AccessPoint, crate::raw::accesspoint::AccessPointProxy<'_>);
impl AccessPoint {
pub async fn capability_flags(&self) -> Result<AccessPointCapabilityFlags, Error> {
let value = self.raw().await?.flags().await?;
Ok(AccessPointCapabilityFlags::from_bits_retain(value))
}
pub async fn wpa_security_flags(&self) -> Result<AccessPointSecurityFlags, Error> {
let value = self.raw().await?.wpa_flags().await?;
Ok(AccessPointSecurityFlags::from_bits_retain(value))
}
pub async fn rsn_security_flags(&self) -> Result<AccessPointSecurityFlags, Error> {
let value = self.raw().await?.rsn_flags().await?;
Ok(AccessPointSecurityFlags::from_bits_retain(value))
}
pub async fn ssid(&self) -> Result<Vec<u8>, Error> {
self.raw().await?.ssid().await.map_err(Error::ZBus)
}
pub async fn frequency(&self) -> Result<u32, Error> {
self.raw().await?.frequency().await.map_err(Error::ZBus)
}
pub async fn bssid(&self) -> Result<String, Error> {
self.raw().await?.hw_address().await.map_err(Error::ZBus)
}
pub async fn mode(&self) -> Result<AccessPointMode, Error> {
let state = self.raw().await?.mode().await?;
FromPrimitive::from_u32(state).ok_or(Error::UnsupportedType)
}
pub async fn max_bitrate(&self) -> Result<u32, Error> {
self.raw().await?.max_bitrate().await.map_err(Error::ZBus)
}
pub async fn strength(&self) -> Result<u8, Error> {
self.raw().await?.strength().await.map_err(Error::ZBus)
}
pub async fn last_seen(&self) -> Result<Option<u32>, Error> {
let ts = self.raw().await?.last_seen().await?;
if let Ok(ts) = u32::try_from(ts) {
Ok(Some(ts))
} else {
Ok(None)
}
}
}