use std::fmt::Display;
use bitflags::bitflags;
use le_stream::{FromLeStream, ToLeStream};
use crate::ember::types::Eui64;
#[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)]
#[repr(transparent)]
pub struct Bitmask(u16);
bitflags! {
impl Bitmask: u16 {
const STANDARD_SECURITY_MODE = 0x0000;
const DISTRIBUTED_TRUST_CENTER_MODE = 0x0002;
const GLOBAL_LINK_KEY = 0x0004;
const HAVE_TRUST_CENTER_LINK_KEY = 0x0010;
const TRUST_CENTER_USES_HASHED_LINK_KEY = 0x0084;
}
}
impl From<Bitmask> for u16 {
fn from(bitmask: Bitmask) -> Self {
bitmask.0
}
}
impl From<u16> for Bitmask {
fn from(value: u16) -> Self {
Self::from_bits_truncate(value)
}
}
#[derive(Clone, Debug, Eq, PartialEq, FromLeStream, ToLeStream)]
pub struct State {
bitmask: u16,
trust_center_long_address: Eui64,
}
impl State {
#[must_use]
pub const fn new(bitmask: Bitmask, trust_center_long_address: Eui64) -> Self {
Self {
bitmask: bitmask.0,
trust_center_long_address,
}
}
#[must_use]
pub fn bitmask(&self) -> Bitmask {
Bitmask::from(self.bitmask)
}
#[must_use]
pub const fn trust_center_long_address(&self) -> Eui64 {
self.trust_center_long_address
}
}
impl Display for State {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "Bitmask:")?;
for (name, bitmask) in self.bitmask().iter_names() {
writeln!(f, "\t{name}: {bitmask:#06X}")?;
}
writeln!(
f,
"Trust Center Long Address: {}",
self.trust_center_long_address
)
}
}