dbc_rs/bit_timing/builder/
build.rs

1use super::BitTimingBuilder;
2use crate::{BitTiming, Result};
3
4impl BitTimingBuilder {
5    /// Builds the `BitTiming` from this builder.
6    ///
7    /// # Returns
8    ///
9    /// Returns `Ok(BitTiming)` with the configured values.
10    /// Returns an empty `BitTiming` if no values were set.
11    ///
12    /// # Examples
13    ///
14    /// ```rust,no_run
15    /// use dbc_rs::BitTimingBuilder;
16    ///
17    /// let bt = BitTimingBuilder::new()
18    ///     .baudrate(500000)
19    ///     .btr1(1)
20    ///     .btr2(2)
21    ///     .build()?;
22    ///
23    /// assert_eq!(bt.baudrate(), Some(500000));
24    /// assert_eq!(bt.btr1(), Some(1));
25    /// assert_eq!(bt.btr2(), Some(2));
26    /// # Ok::<(), dbc_rs::Error>(())
27    /// ```
28    pub fn build(self) -> Result<BitTiming> {
29        match (self.baudrate, self.btr1, self.btr2) {
30            (Some(baudrate), Some(btr1), Some(btr2)) => {
31                Ok(BitTiming::with_btr(baudrate, btr1, btr2))
32            }
33            (Some(baudrate), _, _) => Ok(BitTiming::with_baudrate(baudrate)),
34            _ => Ok(BitTiming::new()),
35        }
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::BitTimingBuilder;
42
43    #[test]
44    fn test_build_empty() {
45        let bt = BitTimingBuilder::new().build().unwrap();
46        assert!(bt.is_empty());
47    }
48
49    #[test]
50    fn test_build_with_baudrate() {
51        let bt = BitTimingBuilder::new().baudrate(250000).build().unwrap();
52        assert_eq!(bt.baudrate(), Some(250000));
53        assert_eq!(bt.btr1(), None);
54    }
55
56    #[test]
57    fn test_build_with_all_values() {
58        let bt = BitTimingBuilder::new().baudrate(1000000).btr1(5).btr2(10).build().unwrap();
59        assert_eq!(bt.baudrate(), Some(1000000));
60        assert_eq!(bt.btr1(), Some(5));
61        assert_eq!(bt.btr2(), Some(10));
62    }
63
64    #[test]
65    fn test_build_btr_without_baudrate_ignored() {
66        // BTR values without baudrate result in empty BitTiming
67        let bt = BitTimingBuilder::new().btr1(1).btr2(2).build().unwrap();
68        assert!(bt.is_empty());
69    }
70
71    #[test]
72    fn test_build_partial_btr() {
73        // Only BTR1 without BTR2 - baudrate only is preserved
74        let bt = BitTimingBuilder::new().baudrate(500000).btr1(1).build().unwrap();
75        assert_eq!(bt.baudrate(), Some(500000));
76        // BTR values are ignored if not both present
77        assert_eq!(bt.btr1(), None);
78    }
79}