dbc_rs/nodes/mod.rs
1mod core;
2mod parse;
3#[cfg(feature = "std")]
4mod serialize;
5
6#[cfg(feature = "std")]
7mod builder;
8
9use crate::{
10 MAX_NAME_SIZE, MAX_NODES,
11 compat::{String, Vec},
12};
13#[cfg(feature = "std")]
14pub use builder::NodesBuilder;
15
16/// Represents a collection of node (ECU) names from a DBC file.
17///
18/// The `BU_` statement in a DBC file lists all nodes (ECUs) on the CAN bus.
19/// This struct stores the node names as borrowed references.
20///
21/// # Examples
22///
23/// ```rust,no_run
24/// use dbc_rs::Dbc;
25///
26/// let dbc = Dbc::parse(r#"VERSION "1.0"
27///
28/// BU_: ECM TCM BCM
29///
30/// BO_ 256 Engine : 8 ECM
31/// SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm"
32/// "#)?;
33///
34/// // Access nodes
35/// assert_eq!(dbc.nodes().len(), 3);
36/// assert!(dbc.nodes().contains("ECM"));
37/// assert!(dbc.nodes().contains("TCM"));
38///
39/// // Iterate over nodes
40/// for node in dbc.nodes().iter() {
41/// println!("Node: {}", node);
42/// }
43/// # Ok::<(), dbc_rs::Error>(())
44/// ```
45///
46/// # Empty Nodes
47///
48/// A DBC file may have an empty node list (`BU_:` with no nodes):
49///
50/// ```rust,no_run
51/// use dbc_rs::Dbc;
52///
53/// let dbc = Dbc::parse(r#"VERSION "1.0"
54///
55/// BU_:
56///
57/// BO_ 256 Engine : 8 ECM
58/// "#)?;
59///
60/// assert!(dbc.nodes().is_empty());
61/// # Ok::<(), dbc_rs::Error>(())
62/// ```
63///
64/// # DBC Format
65///
66/// In DBC files, nodes are specified on the `BU_` line:
67/// - Format: `BU_: Node1 Node2 Node3 ...`
68/// - Node names are space-separated
69/// - Maximum of 256 nodes (DoS protection)
70/// - All node names must be unique (case-sensitive)
71/// - Empty node list is valid (`BU_:`)
72/// - Maximum 32 characters per node name by default
73#[derive(Debug, Default, PartialEq, Eq, Hash)]
74pub struct Nodes {
75 nodes: Vec<String<{ MAX_NAME_SIZE }>, { MAX_NODES }>,
76}