Skip to main content

nros_diagnostic_msgs/msg/
diagnostic_array.rs

1// nros message type - pure Rust, no_std compatible
2// Package: diagnostic_msgs
3// Message: DiagnosticArray
4
5use nros_core::{Deserialize, RosMessage, Serialize};
6use nros_serdes::{CdrReader, CdrWriter, DeserError, SerError};
7
8/// DiagnosticArray message type
9#[derive(Debug, Clone, Default, PartialEq)]
10pub struct DiagnosticArray {
11    pub header: nros_std_msgs::msg::Header,
12    pub status: heapless::Vec<crate::msg::DiagnosticStatus, 4>,
13}
14
15impl Serialize for DiagnosticArray {
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.header.serialize(writer)?;
21        writer.write_u32(self.status.len() as u32)?;
22        for item in &self.status {
23            item.serialize(writer)?;
24        }
25        writer.end_dheader(__dh)?;
26        Ok(())
27    }
28}
29
30impl Deserialize for DiagnosticArray {
31    fn deserialize(reader: &mut CdrReader) -> Result<Self, DeserError> {
32        // phase-303 W4 (#0267) — read the XCDR2 DHEADER (no-op under XCDR1);
33        // end_dheader skips any unknown trailing members (forward compat).
34        let __dh = reader.begin_dheader()?;
35        let __value = Self {
36            header: Deserialize::deserialize(reader)?,
37            status: {
38                let len = reader.read_u32()? as usize;
39                let mut vec = heapless::Vec::new();
40                for _ in 0..len {
41                    vec.push(Deserialize::deserialize(reader)?)
42                        .map_err(|_| DeserError::CapacityExceeded)?;
43                }
44                vec
45            },
46        };
47        reader.end_dheader(__dh)?;
48        Ok(__value)
49    }
50}
51
52impl RosMessage for DiagnosticArray {
53    const TYPE_NAME: &'static str = "diagnostic_msgs::msg::dds_::DiagnosticArray_";
54    const TYPE_HASH: &'static str = "TypeHashNotSupported";
55    // RFC-0052 W3a — Header/Time-leading type: `stamp.sec` at CDR byte
56    // 4 (raw-buffer peek for on-target max_age monitors).
57    const STAMP_OFFSET: Option<usize> = Some(4);
58    // Issue 1179 -- the type's bound on `RosMessage`, the one trait every
59    // backend's registration can read. Computed from the schema below, not
60    // copied, so it cannot drift from it.
61    const MAX_SERIALIZED_BOUND: Option<usize> = ::nros_serdes::size::max_serialized_bound::<Self>();
62}
63
64// ── nros_serdes::Message — runtime field schema ─────────────────────────────
65// Consumed by RMW backends that build wire-type descriptors at runtime
66// (Cyclone DDS dynamic types, …) without per-RMW codegen at compile time.
67
68#[allow(non_upper_case_globals)]
69pub const NESTED_HEADER: ::nros_serdes::NestedType = ::nros_serdes::NestedType {
70    type_name: <nros_std_msgs::msg::Header as ::nros_serdes::Message>::TYPE_NAME,
71    fields: <nros_std_msgs::msg::Header as ::nros_serdes::Message>::FIELDS,
72};
73#[allow(non_upper_case_globals)]
74pub const NESTED_STATUS: ::nros_serdes::NestedType = ::nros_serdes::NestedType {
75    type_name: <crate::msg::DiagnosticStatus as ::nros_serdes::Message>::TYPE_NAME,
76    fields: <crate::msg::DiagnosticStatus as ::nros_serdes::Message>::FIELDS,
77};
78#[allow(non_upper_case_globals)]
79pub const FT_STATUS_ELEM: ::nros_serdes::FieldType =
80    ::nros_serdes::FieldType::Nested(&NESTED_STATUS);
81impl ::nros_serdes::Message for DiagnosticArray {
82    const TYPE_NAME: &'static str = "diagnostic_msgs/msg/DiagnosticArray";
83    const FIELDS: &'static [::nros_serdes::Field] = &[
84        ::nros_serdes::Field {
85            name: "header",
86            ty: ::nros_serdes::FieldType::Nested(&NESTED_HEADER),
87            offset: ::core::mem::offset_of!(DiagnosticArray, header),
88        },
89        ::nros_serdes::Field {
90            name: "status",
91            ty: ::nros_serdes::FieldType::BoundedSequence(4, &FT_STATUS_ELEM),
92            offset: ::core::mem::offset_of!(DiagnosticArray, status),
93        },
94    ];
95}