use alloc::string::String;
use core::fmt;
use procmacros::BuilderLite;
use super::{AuthenticationMethod, Protocols, Ssid};
use crate::WifiError;
unstable_module!(
#[cfg(feature = "wifi-eap")]
#[cfg_attr(docsrs, doc(cfg(feature = "wifi-eap")))]
pub mod eap;
);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[non_exhaustive]
#[repr(u8)]
#[instability::unstable]
pub enum ScanMethod {
Fast,
AllChannels,
}
#[derive(BuilderLite, Clone, Eq, PartialEq, Hash)]
pub struct StationConfig {
#[builder_lite(skip_setter)]
pub(crate) ssid: Ssid,
pub(crate) bssid: Option<[u8; 6]>,
pub(crate) auth_method: AuthenticationMethod,
#[builder_lite(reference)]
pub(crate) password: String,
pub(crate) channel: Option<u8>,
pub(crate) protocols: Protocols,
#[builder_lite(unstable)]
pub(crate) listen_interval: u16,
#[builder_lite(unstable)]
pub(crate) beacon_timeout: u16,
#[builder_lite(unstable)]
pub(crate) failure_retry_cnt: u8,
#[builder_lite(unstable)]
pub(crate) scan_method: ScanMethod,
}
impl StationConfig {
pub fn with_ssid(mut self, ssid: impl Into<Ssid>) -> Self {
self.ssid = ssid.into();
self
}
pub(crate) fn validate(&self) -> Result<(), WifiError> {
if self.ssid.len() > 32 {
return Err(WifiError::InvalidArguments);
}
if self.password.len() > 64 {
return Err(WifiError::InvalidArguments);
}
if !(6..=31).contains(&self.beacon_timeout) {
return Err(WifiError::InvalidArguments);
}
Ok(())
}
}
impl Default for StationConfig {
fn default() -> Self {
StationConfig {
ssid: Ssid::default(),
bssid: None,
auth_method: AuthenticationMethod::Wpa2Personal,
password: String::new(),
channel: None,
protocols: Protocols::default(),
listen_interval: 3,
beacon_timeout: 6,
failure_retry_cnt: 1,
scan_method: ScanMethod::Fast,
}
}
}
impl fmt::Debug for StationConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("StationConfig")
.field("ssid", &self.ssid)
.field("bssid", &self.bssid)
.field("auth_method", &self.auth_method)
.field("password", &"**REDACTED**")
.field("channel", &self.channel)
.field("protocols", &self.protocols)
.field("listen_interval", &self.listen_interval)
.field("beacon_timeout", &self.beacon_timeout)
.field("failure_retry_cnt", &self.failure_retry_cnt)
.field("scan_method", &self.scan_method)
.finish()
}
}
#[cfg(feature = "defmt")]
impl defmt::Format for StationConfig {
fn format(&self, fmt: defmt::Formatter<'_>) {
defmt::write!(
fmt,
"StationConfig {{\
ssid: {}, \
bssid: {:?}, \
auth_method: {:?}, \
password: **REDACTED**, \
channel: {:?}, \
protocols: {}, \
listen_interval: {}, \
beacon_timeout: {}, \
failure_retry_cnt: {}, \
scan_method: {} \
}}",
self.ssid.as_str(),
self.bssid,
self.auth_method,
self.channel,
self.protocols,
self.listen_interval,
self.beacon_timeout,
self.failure_retry_cnt,
self.scan_method
)
}
}