dbc_rs/receivers/std.rs
1use super::Receivers;
2use std::string::String;
3
4impl Receivers {
5 /// Converts the receivers to their DBC file string representation.
6 ///
7 /// Per DBC spec Section 9.5:
8 /// ```bnf
9 /// receivers = receiver {',' receiver} ;
10 /// receiver = node_name | 'Vector__XXX' ;
11 /// ```
12 ///
13 /// - Specific nodes are comma-separated
14 /// - Empty or None receivers serialize as `Vector__XXX`
15 ///
16 /// # Examples
17 ///
18 /// ```rust
19 /// use dbc_rs::{ReceiversBuilder, Receivers};
20 ///
21 /// // No receivers -> Vector__XXX
22 /// let none = ReceiversBuilder::new().none().build().unwrap();
23 /// assert_eq!(none.to_dbc_string(), "Vector__XXX");
24 ///
25 /// // Single receiver
26 /// let single = ReceiversBuilder::new().add_node("TCM").build().unwrap();
27 /// assert_eq!(single.to_dbc_string(), "TCM");
28 ///
29 /// // Multiple receivers -> comma-separated
30 /// let multi = ReceiversBuilder::new().add_node("TCM").add_node("BCM").build().unwrap();
31 /// assert_eq!(multi.to_dbc_string(), "TCM,BCM");
32 /// ```
33 #[must_use = "return value should be used"]
34 pub fn to_dbc_string(&self) -> String {
35 match self {
36 Receivers::Nodes(nodes) if nodes.is_empty() => crate::VECTOR_XXX.to_string(),
37 Receivers::Nodes(nodes) => {
38 let mut result = String::with_capacity(nodes.len() * 10);
39 for (i, node) in nodes.iter().enumerate() {
40 if i > 0 {
41 result.push(',');
42 }
43 result.push_str(node.as_str());
44 }
45 result
46 }
47 Receivers::None => crate::VECTOR_XXX.to_string(),
48 }
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use crate::ReceiversBuilder;
55
56 #[test]
57 fn test_receivers_to_dbc_string_none() {
58 let receivers = ReceiversBuilder::new().none().build().unwrap();
59 assert_eq!(receivers.to_dbc_string(), "Vector__XXX");
60 }
61
62 #[test]
63 fn test_receivers_to_dbc_string_single() {
64 let receivers = ReceiversBuilder::new().add_node("TCM").build().unwrap();
65 assert_eq!(receivers.to_dbc_string(), "TCM");
66 }
67
68 #[test]
69 fn test_receivers_to_dbc_string_multiple() {
70 let receivers = ReceiversBuilder::new().add_node("TCM").add_node("BCM").build().unwrap();
71 assert_eq!(receivers.to_dbc_string(), "TCM,BCM");
72 }
73
74 #[test]
75 fn test_receivers_to_dbc_string_empty_nodes() {
76 // Edge case: Nodes variant with empty list
77 let receivers = ReceiversBuilder::new().build().unwrap();
78 assert_eq!(receivers.to_dbc_string(), "Vector__XXX");
79 }
80}