Skip to main content

nros_builtin_interfaces/msg/
time.rs

1// nros message type - pure Rust, no_std compatible
2// Package: builtin_interfaces
3// Message: Time
4
5use nros_core::{Deserialize, RosMessage, Serialize};
6use nros_serdes::{CdrReader, CdrWriter, DeserError, SerError};
7
8/// Time message type
9#[derive(Debug, Clone, Default, PartialEq)]
10pub struct Time {
11    pub sec: i32,
12    pub nanosec: u32,
13}
14
15impl Serialize for Time {
16    fn serialize(&self, writer: &mut CdrWriter) -> Result<(), SerError> {
17        // phase-303 W4 (#0267) — DHEADER wrap for XCDR2 appendable structs.
18        // No-op under XCDR1 (byte-identical); under XCDR2 delimits this struct.
19        let __dh = writer.begin_dheader()?;
20        writer.write_i32(self.sec)?;
21        writer.write_u32(self.nanosec)?;
22        writer.end_dheader(__dh)?;
23        Ok(())
24    }
25}
26
27impl Deserialize for Time {
28    fn deserialize(reader: &mut CdrReader) -> Result<Self, DeserError> {
29        // phase-303 W4 (#0267) — read the XCDR2 DHEADER (no-op under XCDR1);
30        // end_dheader skips any unknown trailing members (forward compat).
31        let __dh = reader.begin_dheader()?;
32        let __value = Self {
33            sec: reader.read_i32()?,
34            nanosec: reader.read_u32()?,
35        };
36        reader.end_dheader(__dh)?;
37        Ok(__value)
38    }
39}
40
41// ── nros_core::SecNanosecMsg — what `Time::to_ros_msg()` returns ────────────
42// phase-467 Q3. This message's field set is `{ sec: i32, nanosec: u32 }`, so a
43// `nros_core::Time` reaches it by two field copies. `nros-core` cannot name a
44// message type — every generated crate depends on it, and message types are
45// generated per USER package — so the impl is emitted HERE and the trait is the
46// seam. It is the Rust stand-in for `nros::Time::to_msg`'s C++
47// `template <typename TimeMsgT>`, which binds structurally to the same shape.
48impl nros_core::SecNanosecMsg for Time {
49    fn from_sec_nanosec(sec: i32, nanosec: u32) -> Self {
50        Self { sec, nanosec }
51    }
52}
53
54impl RosMessage for Time {
55    const TYPE_NAME: &'static str = "builtin_interfaces::msg::dds_::Time_";
56    const TYPE_HASH: &'static str = "TypeHashNotSupported";
57    // Issue 1179 -- the type's bound on `RosMessage`, the one trait every
58    // backend's registration can read. Computed from the schema below, not
59    // copied, so it cannot drift from it.
60    const MAX_SERIALIZED_BOUND: Option<usize> = ::nros_serdes::size::max_serialized_bound::<Self>();
61}
62
63// ── nros_serdes::Message — runtime field schema ─────────────────────────────
64// Consumed by RMW backends that build wire-type descriptors at runtime
65// (Cyclone DDS dynamic types, …) without per-RMW codegen at compile time.
66
67impl ::nros_serdes::Message for Time {
68    const TYPE_NAME: &'static str = "builtin_interfaces/msg/Time";
69    const FIELDS: &'static [::nros_serdes::Field] = &[
70        ::nros_serdes::Field {
71            name: "sec",
72            ty: ::nros_serdes::FieldType::Int32,
73            offset: ::core::mem::offset_of!(Time, sec),
74        },
75        ::nros_serdes::Field {
76            name: "nanosec",
77            ty: ::nros_serdes::FieldType::Uint32,
78            offset: ::core::mem::offset_of!(Time, nanosec),
79        },
80    ];
81}