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}