use crate::Error;
use bytemuck::{Pod, Zeroable};
const WIFI_CONFIG_MAGIC: u32 = 0x5749_4649;
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
#[repr(C)]
pub struct WifiConfig {
magic: u32, ssid: [u8; 32], password: [u8; 64], ssid_len: u8, password_len: u8, _padding: [u8; 2], }
impl Default for WifiConfig {
fn default() -> Self {
Self {
magic: WIFI_CONFIG_MAGIC,
ssid_len: 0,
password_len: 0,
ssid: [0; 32],
password: [0; 64],
_padding: [0; 2],
}
}
}
impl WifiConfig {
pub fn new(ssid: &[u8], password: &[u8]) -> Result<Self, Error> {
let mut wf = Self::default();
wf.set_credentials(ssid, password)?;
Ok(wf)
}
#[must_use]
pub fn is_valid(&self) -> bool {
self.magic == WIFI_CONFIG_MAGIC
}
#[allow(clippy::cast_possible_truncation)]
pub fn set_credentials(&mut self, ssid: &[u8], password: &[u8]) -> Result<(), Error> {
if ssid.len() > 32 || password.len() > 64 {
return Err(Error::CredentialLengthExceeded);
}
self.ssid_len = ssid.len() as u8;
self.password_len = password.len() as u8;
self.ssid.fill(0);
self.password.fill(0);
self.ssid[..ssid.len()].copy_from_slice(ssid);
self.password[..password.len()].copy_from_slice(password);
Ok(())
}
#[must_use]
pub fn ssid(&self) -> &[u8] {
&self.ssid[..self.ssid_len as usize]
}
#[must_use]
pub fn password(&self) -> &[u8] {
&self.password[..self.password_len as usize]
}
}