dbc_rs/dbc/builder/
methods.rs

1use super::DbcBuilder;
2use crate::{MessageBuilder, NodesBuilder, VersionBuilder};
3
4impl DbcBuilder {
5    /// Sets the version for the DBC file.
6    ///
7    /// # Examples
8    ///
9    /// ```rust,no_run
10    /// use dbc_rs::{DbcBuilder, VersionBuilder};
11    ///
12    /// let vb = VersionBuilder::new().version("1.0");
13    /// let builder = DbcBuilder::new()
14    ///     .version(vb);
15    /// # Ok::<(), dbc_rs::Error>(())
16    /// ```
17    #[must_use = "builder method returns modified builder"]
18    pub fn version(mut self, version: VersionBuilder) -> Self {
19        self.version = version;
20        self
21    }
22
23    /// Sets the nodes (ECUs) for the DBC file.
24    ///
25    /// # Examples
26    ///
27    /// ```rust,no_run
28    /// use dbc_rs::{DbcBuilder, NodesBuilder};
29    ///
30    /// let builder = DbcBuilder::new()
31    ///     .nodes(NodesBuilder::new().add_node("ECM"));
32    /// # Ok::<(), dbc_rs::Error>(())
33    /// ```
34    #[must_use = "builder method returns modified builder"]
35    pub fn nodes(mut self, nodes: NodesBuilder) -> Self {
36        self.nodes = nodes;
37        self
38    }
39
40    /// Adds a message to the DBC file.
41    ///
42    /// # Examples
43    ///
44    /// ```rust,no_run
45    /// use dbc_rs::{DbcBuilder, MessageBuilder};
46    ///
47    /// let message = MessageBuilder::new()
48    ///     .id(256)
49    ///     .name("EngineData")
50    ///     .dlc(8)
51    ///     .sender("ECM");
52    ///
53    /// let builder = DbcBuilder::new()
54    ///     .add_message(message);
55    /// # Ok::<(), dbc_rs::Error>(())
56    /// ```
57    #[must_use = "builder method returns modified builder"]
58    pub fn add_message(mut self, message: MessageBuilder) -> Self {
59        self.messages.push(message);
60        self
61    }
62
63    /// Adds multiple messages to the DBC file.
64    ///
65    /// # Examples
66    ///
67    /// ```rust,no_run
68    /// use dbc_rs::{DbcBuilder, MessageBuilder};
69    ///
70    /// let msg1 = MessageBuilder::new().id(256).name("Msg1").dlc(8).sender("ECM");
71    /// let msg2 = MessageBuilder::new().id(512).name("Msg2").dlc(4).sender("TCM");
72    ///
73    /// let builder = DbcBuilder::new()
74    ///     .add_messages(vec![msg1, msg2]);
75    /// # Ok::<(), dbc_rs::Error>(())
76    /// ```
77    #[must_use = "builder method returns modified builder"]
78    pub fn add_messages(mut self, messages: impl IntoIterator<Item = MessageBuilder>) -> Self {
79        self.messages.extend(messages);
80        self
81    }
82
83    /// Clears all messages from the builder.
84    ///
85    /// # Examples
86    ///
87    /// ```rust,no_run
88    /// use dbc_rs::DbcBuilder;
89    ///
90    /// let builder = DbcBuilder::new()
91    ///     .clear_messages();
92    /// ```
93    #[must_use = "builder method returns modified builder"]
94    pub fn clear_messages(mut self) -> Self {
95        self.messages.clear();
96        self
97    }
98}
99
100#[cfg(test)]
101mod tests {
102    #![allow(clippy::float_cmp)]
103    use super::DbcBuilder;
104    use crate::{
105        ByteOrder, MessageBuilder, NodesBuilder, ReceiversBuilder, SignalBuilder, VersionBuilder,
106    };
107
108    #[test]
109    fn test_dbc_builder_add_messages() {
110        let version = VersionBuilder::new().version("1.0");
111        let nodes = NodesBuilder::new().add_nodes(["ECM"]);
112        let signal1 = SignalBuilder::new()
113            .name("RPM")
114            .start_bit(0)
115            .length(16)
116            .byte_order(ByteOrder::BigEndian)
117            .unsigned(true)
118            .factor(1.0)
119            .offset(0.0)
120            .min(0.0)
121            .max(100.0)
122            .receivers(ReceiversBuilder::new().none());
123        let signal2 = SignalBuilder::new()
124            .name("RPM")
125            .start_bit(0)
126            .length(16)
127            .byte_order(ByteOrder::BigEndian)
128            .unsigned(true)
129            .factor(1.0)
130            .offset(0.0)
131            .min(0.0)
132            .max(100.0)
133            .receivers(ReceiversBuilder::new().none());
134        let message1 = MessageBuilder::new()
135            .id(256)
136            .name("EngineData")
137            .dlc(8)
138            .sender("ECM")
139            .add_signal(signal1);
140        let message2 = MessageBuilder::new()
141            .id(512)
142            .name("BrakeData")
143            .dlc(4)
144            .sender("ECM")
145            .add_signal(signal2);
146
147        let dbc = DbcBuilder::new()
148            .version(version)
149            .nodes(nodes)
150            .add_messages(vec![message1, message2])
151            .build()
152            .unwrap();
153
154        assert_eq!(dbc.messages().len(), 2);
155    }
156
157    #[test]
158    fn test_dbc_builder_messages() {
159        let version = VersionBuilder::new().version("1.0");
160        let nodes = NodesBuilder::new().add_nodes(["ECM"]);
161
162        let signal1 = SignalBuilder::new()
163            .name("RPM")
164            .start_bit(0)
165            .length(16)
166            .byte_order(ByteOrder::BigEndian)
167            .unsigned(true)
168            .factor(1.0)
169            .offset(0.0)
170            .min(0.0)
171            .max(100.0)
172            .receivers(ReceiversBuilder::new().none());
173        let message1 = MessageBuilder::new()
174            .id(256)
175            .name("EngineData")
176            .dlc(8)
177            .sender("ECM")
178            .add_signal(signal1);
179
180        let signal2 = SignalBuilder::new()
181            .name("RPM")
182            .start_bit(0)
183            .length(16)
184            .byte_order(ByteOrder::BigEndian)
185            .unsigned(true)
186            .factor(1.0)
187            .offset(0.0)
188            .min(0.0)
189            .max(100.0)
190            .receivers(ReceiversBuilder::new().none());
191        let message2 = MessageBuilder::new()
192            .id(512)
193            .name("EngineData2")
194            .dlc(8)
195            .sender("ECM")
196            .add_signal(signal2);
197
198        let dbc = DbcBuilder::new()
199            .version(version)
200            .nodes(nodes)
201            .add_message(message1)
202            .add_message(message2)
203            .build()
204            .unwrap();
205
206        assert_eq!(dbc.messages().len(), 2);
207    }
208
209    #[test]
210    fn test_dbc_builder_clear_messages() {
211        let version = VersionBuilder::new().version("1.0");
212        let nodes = NodesBuilder::new().add_nodes(["ECM"]);
213        let signal = SignalBuilder::new()
214            .name("RPM")
215            .start_bit(0)
216            .length(16)
217            .byte_order(ByteOrder::BigEndian)
218            .unsigned(true)
219            .factor(1.0)
220            .offset(0.0)
221            .min(0.0)
222            .max(100.0)
223            .receivers(ReceiversBuilder::new().none());
224        let message = MessageBuilder::new()
225            .id(256)
226            .name("EngineData")
227            .dlc(8)
228            .sender("ECM")
229            .add_signal(signal);
230
231        let dbc = DbcBuilder::new()
232            .version(version)
233            .nodes(nodes)
234            .add_message(message)
235            .clear_messages()
236            .build()
237            .unwrap();
238
239        assert_eq!(dbc.messages().len(), 0);
240    }
241}