use crate::errors::MbusError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct UnitIdOrSlaveAddr(u8);
impl UnitIdOrSlaveAddr {
pub fn new(address: u8) -> Result<Self, MbusError> {
if (1..=247).contains(&address) {
return Ok(Self(address));
}
if 0 == address {
return Err(MbusError::InvalidBroadcastAddress);
}
Err(MbusError::InvalidSlaveAddress)
}
pub fn new_broadcast_address() -> Self {
Self(0)
}
pub fn is_broadcast(&self) -> bool {
self.0 == 0
}
pub fn get(&self) -> u8 {
self.0
}
}
impl Default for UnitIdOrSlaveAddr {
fn default() -> Self {
Self(255)
}
}
impl TryFrom<u8> for UnitIdOrSlaveAddr {
type Error = MbusError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
UnitIdOrSlaveAddr::new(value)
}
}
impl From<UnitIdOrSlaveAddr> for u8 {
fn from(val: UnitIdOrSlaveAddr) -> Self {
val.get()
}
}
pub trait UidSaddrFrom {
fn from_u8(uid_saddr: u8) -> Self;
}
impl UidSaddrFrom for UnitIdOrSlaveAddr {
fn from_u8(value: u8) -> Self {
UnitIdOrSlaveAddr::new(value).unwrap_or_default()
}
}