Skip to main content

nros_std_msgs/msg/
header.rs

1// nros message type - pure Rust, no_std compatible
2// Package: std_msgs
3// Message: Header
4
5use nros_core::{Deserialize, RosMessage, Serialize};
6use nros_serdes::{CdrReader, CdrWriter, DeserError, SerError};
7
8/// Header message type
9#[derive(Debug, Clone, Default, PartialEq)]
10pub struct Header {
11    pub stamp: nros_builtin_interfaces::msg::Time,
12    pub frame_id: heapless::String<256>,
13}
14
15impl Serialize for Header {
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        self.stamp.serialize(writer)?;
21        writer.write_string(self.frame_id.as_str())?;
22        writer.end_dheader(__dh)?;
23        Ok(())
24    }
25}
26
27impl Deserialize for Header {
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            stamp: Deserialize::deserialize(reader)?,
34            frame_id: {
35                let s = reader.read_string()?;
36                heapless::String::try_from(s).map_err(|_| DeserError::CapacityExceeded)?
37            },
38        };
39        reader.end_dheader(__dh)?;
40        Ok(__value)
41    }
42}
43
44impl RosMessage for Header {
45    const TYPE_NAME: &'static str = "std_msgs::msg::dds_::Header_";
46    const TYPE_HASH: &'static str = "TypeHashNotSupported";
47    // RFC-0052 W3a — Header/Time-leading type: `stamp.sec` at CDR byte
48    // 4 (raw-buffer peek for on-target max_age monitors).
49    const STAMP_OFFSET: Option<usize> = Some(4);
50    // Issue 1179 -- the type's bound on `RosMessage`, the one trait every
51    // backend's registration can read. Computed from the schema below, not
52    // copied, so it cannot drift from it.
53    const MAX_SERIALIZED_BOUND: Option<usize> = ::nros_serdes::size::max_serialized_bound::<Self>();
54}
55
56// ── nros_serdes::Message — runtime field schema ─────────────────────────────
57// Consumed by RMW backends that build wire-type descriptors at runtime
58// (Cyclone DDS dynamic types, …) without per-RMW codegen at compile time.
59
60#[allow(non_upper_case_globals)]
61pub const NESTED_STAMP: ::nros_serdes::NestedType = ::nros_serdes::NestedType {
62    type_name: <nros_builtin_interfaces::msg::Time as ::nros_serdes::Message>::TYPE_NAME,
63    fields: <nros_builtin_interfaces::msg::Time as ::nros_serdes::Message>::FIELDS,
64};
65impl ::nros_serdes::Message for Header {
66    const TYPE_NAME: &'static str = "std_msgs/msg/Header";
67    const FIELDS: &'static [::nros_serdes::Field] = &[
68        ::nros_serdes::Field {
69            name: "stamp",
70            ty: ::nros_serdes::FieldType::Nested(&NESTED_STAMP),
71            offset: ::core::mem::offset_of!(Header, stamp),
72        },
73        ::nros_serdes::Field {
74            name: "frame_id",
75            ty: ::nros_serdes::FieldType::String,
76            offset: ::core::mem::offset_of!(Header, frame_id),
77        },
78    ];
79}