stm32builder/types/
temperature_range.rs

1//! Temperature type module
2
3use crate::api::Error;
4use serde_derive::Serialize;
5
6/// Temperature range allowed
7/// Encoded on the 12th character of the device identification number.
8#[derive(Debug, Clone, PartialEq, Serialize)]
9pub struct TemperatureRange {
10    pub min: i16,
11    pub max: i16,
12}
13
14impl TemperatureRange {
15    /// Return a new temperature range from its encoding character or `UnknownTemperatureRange` on
16    /// failure.
17    pub fn from_temperature_range_str(code: &str) -> Result<Self, Error> {
18        // NOTE: Please add a test when decoding a new code
19        match code {
20            "6" => Ok(Self { min: -40, max: 85 }),
21            "7" => Ok(Self { min: -40, max: 105 }),
22            code => Err(Error::UnknownTemperatureRange(code.to_string())),
23        }
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    macro_rules! decode { (
32            $name:ident: $code:tt as $sign:tt$min:tt to $max:tt
33        ) => {
34            #[test]
35            fn $name() {
36                let temperature = TemperatureRange::from_temperature_range_str($code).unwrap();
37                assert_eq!(temperature.min, $sign$min);
38                assert_eq!(temperature.max, $max);
39            }
40        };
41    }
42
43    decode!(decode_6_as_m40_to_85: "6" as -40 to 85 );
44    decode!(decode_7_as_m40_to_105: "7" as -40 to 105 );
45
46    #[test]
47    fn error_on_unknown_code() {
48        assert!(TemperatureRange::from_temperature_range_str("_").is_err());
49    }
50}