hiroz 0.2.0

Native Rust ROS 2 implementation using Zenoh
use zenoh::bytes::ZBytes;
use zenoh_ext::{ZDeserializer, ZSerializer};

use crate::time::{ZClock, ZTime};

const RMW_GID_STORAGE_SIZE: usize = 16;

pub type GidArray = [u8; RMW_GID_STORAGE_SIZE];

#[derive(Clone, Hash)]
pub struct Attachment {
    pub sequence_number: i64,
    pub source_timestamp: i64,
    pub source_gid: GidArray,
}

impl Attachment {
    pub fn new(sn: i64, gid: GidArray) -> Self {
        Self::with_source_time(
            sn,
            gid,
            ZTime::from_system_time(std::time::SystemTime::now()),
        )
    }

    pub fn with_clock(sn: i64, gid: GidArray, clock: &ZClock) -> Self {
        Self::with_source_time(sn, gid, clock.now())
    }

    pub fn with_source_time(sn: i64, gid: GidArray, source_time: ZTime) -> Self {
        Self {
            sequence_number: sn,
            source_timestamp: source_time.as_unix_nanos(),
            source_gid: gid,
        }
    }

    pub fn source_time(&self) -> ZTime {
        ZTime::from_unix_nanos(self.source_timestamp)
    }
}

impl TryFrom<&ZBytes> for Attachment {
    type Error = zenoh::Error;
    fn try_from(value: &ZBytes) -> Result<Self, Self::Error> {
        let mut des = ZDeserializer::new(value);
        let sequence_number = des.deserialize::<i64>()?;
        let source_timestamp = des.deserialize::<i64>()?;
        let source_gid = des.deserialize::<GidArray>()?;
        Ok(Attachment {
            sequence_number,
            source_timestamp,
            source_gid,
        })
    }
}

impl From<Attachment> for ZBytes {
    fn from(value: Attachment) -> Self {
        let mut ser = ZSerializer::new();
        ser.serialize(value.sequence_number);
        ser.serialize(value.source_timestamp);
        ser.serialize(value.source_gid);
        ser.finish()
    }
}