dbc_rs/receivers/
mod.rs

1mod impls;
2mod parse;
3
4#[cfg(feature = "std")]
5mod builder;
6#[cfg(feature = "std")]
7mod std;
8
9use crate::{
10    MAX_NODES,
11    compat::{Name, Vec},
12};
13#[cfg(feature = "std")]
14pub use builder::ReceiversBuilder;
15
16type ReceiverNames = Vec<Name, { MAX_NODES - 1 }>;
17
18/// Represents the receiver nodes for a signal in a DBC file.
19///
20/// Per the DBC specification (Section 9.5), receivers are defined as:
21/// ```bnf
22/// receiver = node_name | 'Vector__XXX' ;
23/// receivers = receiver {',' receiver} ;
24/// ```
25///
26/// A signal can have two types of receivers:
27/// - **Specific nodes**: A list of specific node names that receive this signal
28/// - **None**: No explicit receivers specified (use `Vector__XXX` in DBC output)
29///
30/// # Examples
31///
32/// ```rust,no_run
33/// use dbc_rs::Dbc;
34///
35/// let dbc = Dbc::parse(r#"VERSION "1.0"
36///
37/// BU_: ECM TCM BCM
38///
39/// BO_ 256 Engine : 8 ECM
40///  SG_ RPM : 0|16@1+ (0.25,0) [0|8000] "rpm" Vector__XXX
41///  SG_ Temp : 16|8@0- (1,-40) [-40|215] "°C" TCM,BCM
42/// "#)?;
43///
44/// let message = dbc.messages().at(0).unwrap();
45///
46/// // No specific receiver (Vector__XXX)
47/// let rpm_signal = message.signals().find("RPM").unwrap();
48/// assert_eq!(rpm_signal.receivers().len(), 0);
49///
50/// // Specific nodes
51/// let temp_signal = message.signals().find("Temp").unwrap();
52/// assert_eq!(temp_signal.receivers().len(), 2);
53/// assert!(temp_signal.receivers().contains("TCM"));
54/// # Ok::<(), dbc_rs::Error>(())
55/// ```
56///
57/// # DBC Format
58///
59/// In DBC files, receivers are specified after the signal unit:
60/// - Comma-separated node names indicate specific receivers (per spec)
61/// - `Vector__XXX` indicates no specific receiver
62#[derive(Debug, Clone, PartialEq, Eq, Hash)]
63#[allow(clippy::large_enum_variant)]
64pub enum Receivers {
65    /// Specific receiver nodes - vector of node names.
66    Nodes(ReceiverNames),
67    /// No explicit receivers specified (serializes as `Vector__XXX`).
68    None,
69}