use super::Kairos;
use thiserror::Error;
const KAIROS_WIRE_V1: u8 = 0x01;
pub const KAIROS_WIRE_LEN: usize = 17;
impl Kairos {
#[must_use]
pub const fn to_bytes(&self) -> [u8; KAIROS_WIRE_LEN] {
let p = self.0.to_be_bytes();
[
KAIROS_WIRE_V1,
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
]
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
let frame: &[u8; KAIROS_WIRE_LEN] =
bytes
.try_into()
.map_err(|_| DecodeError::UnexpectedLength {
expected: KAIROS_WIRE_LEN,
found: bytes.len(),
})?;
let version = frame[0];
let payload: [u8; KAIROS_WIRE_LEN - 1] =
frame[1..]
.try_into()
.map_err(|_| DecodeError::UnexpectedLength {
expected: KAIROS_WIRE_LEN,
found: bytes.len(),
})?;
match version {
KAIROS_WIRE_V1 => Ok(Self(u128::from_be_bytes(payload))),
other => Err(DecodeError::UnknownVersion(other)),
}
}
}
#[non_exhaustive]
#[derive(Error, Debug, Clone, Copy, PartialEq, Eq)]
pub enum DecodeError {
#[error("unknown Kairos wire version: {0:#04x}")]
UnknownVersion(u8),
#[error("unexpected Kairos frame length: expected {expected}, found {found}")]
UnexpectedLength {
expected: usize,
found: usize,
},
}