domo/domo_proto/src/identifier.rs

75 lines
No EOL
1.7 KiB
Rust

use std::fmt::{Display, Formatter, LowerHex};
use rand::random;
/// Helper struct for the identifiers used in `dest`, `src`, `packet_id` and `reply_to`.
#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
pub struct Identifier {
pub bytes: [u8; 4],
}
impl Identifier {
pub fn random() -> Identifier {
Identifier::from(random::<u32>())
}
}
impl Default for Identifier {
fn default() -> Self {
Identifier::from(0x00000000)
}
}
impl Display for Identifier {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"0x{:x}{:x}{:x}{:x}",
self.bytes[0], self.bytes[1], self.bytes[2], self.bytes[3]
)
}
}
impl LowerHex for Identifier {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{:x}{:x}{:x}{:x}",
self.bytes[0], self.bytes[1], self.bytes[2], self.bytes[3]
)
}
}
impl From<&[u8]> for Identifier {
fn from(value: &[u8]) -> Self {
let mut bytes = [0_u8; 4];
bytes[..4].copy_from_slice(value[..4].as_ref());
Identifier {
bytes
}
}
}
impl From<Vec<u8>> for Identifier {
fn from(value: Vec<u8>) -> Self {
Identifier::from(value.as_slice())
}
}
impl From<u32> for Identifier {
fn from(value: u32) -> Self {
Identifier {
bytes: [
(value >> 24) as u8,
(value >> 16) as u8,
(value >> 8) as u8,
(value >> 0) as u8,
],
}
}
}
impl Into<u32> for Identifier {
fn into(self) -> u32 {
u32::from_be_bytes(self.bytes)
}
}