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}