tf2_rs 0.1.0

ROS 2 TF2 bindings for Rust using cxx and rclrs
use crate::ffi::ffi;
use crate::transform::HasHeader;

#[derive(Clone, Copy, Debug)]
pub enum TimeSpec {
    Latest,
    Stamp { sec: i32, nanosec: u32 },
    FromMsg,
}

impl TimeSpec {
    pub fn resolve<T: HasHeader + ?Sized>(self, msg: &T) -> LookupTime {
        match self {
            TimeSpec::Latest => LookupTime::Latest,
            TimeSpec::Stamp { sec, nanosec } => LookupTime::Time { sec, nanosec },
            TimeSpec::FromMsg => {
                let (sec, nanosec) = msg.stamp();
                LookupTime::Time { sec, nanosec }
            }
        }
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LookupTime {
    Latest,
    Time { sec: i32, nanosec: u32 },
}

impl LookupTime {
    pub fn from_msg<M: HasHeader + ?Sized>(msg: &M) -> Self {
        let (sec, nanosec) = msg.stamp();
        LookupTime::Time { sec, nanosec }
    }
}

impl From<LookupTime> for ffi::Tf2Time {
    fn from(v: LookupTime) -> Self {
        match v {
            LookupTime::Latest => Self { sec: 0, nanosec: 0 },
            LookupTime::Time { sec, nanosec } => Self { sec, nanosec },
        }
    }
}