powerline 0.1.0

Work-in-progress: Power-line communication library
Documentation
use super::*;
use core::str;

#[repr(transparent)]
#[derive(Default, PartialEq, Eq, Copy, Clone)]
pub struct HFIDRequest(pub u8);
impl HFIDRequest {
    pub const GET_MFG: HFIDRequest = HFIDRequest(0x00);
    pub const GET_USR: HFIDRequest = HFIDRequest(0x01);
    pub const GET_NET: HFIDRequest = HFIDRequest(0x02);
    pub const SET_USR: HFIDRequest = HFIDRequest(0x03);
    pub const SET_NET: HFIDRequest = HFIDRequest(0x04);
    pub const FAILURE: HFIDRequest = HFIDRequest(0xff);
}
impl core::fmt::Debug for HFIDRequest {
    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
        match *self {
            HFIDRequest::GET_MFG => write!(f, "GET_MFG"),
            HFIDRequest::GET_USR => write!(f, "GET_USR"),
            HFIDRequest::GET_NET => write!(f, "GET_NET"),
            HFIDRequest::SET_USR => write!(f, "SET_USR"),
            HFIDRequest::SET_NET => write!(f, "SET_NET"),
            HFIDRequest::FAILURE => write!(f, "FAILURE"),
            _ => write!(f, "HFID{:02x}", self.0),
        }
    }
}

#[derive(Eq, PartialEq, Hash)]
pub struct HFID<'a>(pub &'a [u8]);
impl HFID<'_> {
    pub fn request(&self) -> HFIDRequest {
        HFIDRequest(self.payload()[0])
    }
    pub fn hfid_bytes(&self) -> &[u8] {
        &self.payload()[1..=65]
    }
    pub fn hfid(&self) -> &str {
        str::from_utf8(self.hfid_bytes()).unwrap_or_default()
    }
}
impl Message for HFID<'_> {
    const MMV: MMV = MMV::HOMEPLUG_AV_1_1;
    const MMTYPE: MMType = MMType::CM_HFID;
    fn message_data(&self) -> &[u8] {
        &self.0
    }
}
impl core::fmt::Debug for HFID<'_> {
    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
        write!(f, "{:?}: {}", self.request(), self.hfid())
    }
}
impl<'a> From<&'a [u8]> for HFID<'a> {
    fn from(data: &'a [u8]) -> Self {
        Self(data)
    }
}