can_dbc/ast/
value_table.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::ast::ValDescription;
4use crate::parser::{collect_expected, next_string, validated_inner, DbcError};
5
6/// Global value table
7#[derive(Clone, Debug, PartialEq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct ValueTable {
10    pub name: String,
11    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Vec::is_empty"))]
12    pub descriptions: Vec<ValDescription>,
13}
14
15impl TryFrom<Pair<'_, Rule>> for ValueTable {
16    type Error = DbcError;
17
18    /// Parse value table: `VAL_TABLE_ table_name value1 "description1" value2 "description2" ... ;`
19    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
20        let mut pairs = validated_inner(value, Rule::value_table)?;
21
22        let name = next_string(&mut pairs, Rule::table_name)?;
23        let descriptions = collect_expected(&mut pairs, Rule::table_value_description)?;
24
25        Ok(Self { name, descriptions })
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::test_helpers::*;
33
34    #[test]
35    fn val_table_test() {
36        let def = r#"
37VAL_TABLE_ Tst 2 "ABC" 1 "Test A" ;
38"#;
39        let exp = ValueTable {
40            name: "Tst".to_string(),
41            descriptions: vec![
42                ValDescription {
43                    id: 2,
44                    description: "ABC".to_string(),
45                },
46                ValDescription {
47                    id: 1,
48                    description: "Test A".to_string(),
49                },
50            ],
51        };
52        let val = test_into::<ValueTable>(def.trim_start(), Rule::value_table);
53        assert_eq!(val, exp);
54    }
55
56    #[test]
57    fn val_table_no_space_preceding_comma_test() {
58        let def = r#"
59VAL_TABLE_ Tst 2 "ABC";
60"#;
61        let exp = ValueTable {
62            name: "Tst".to_string(),
63            descriptions: vec![ValDescription {
64                id: 2,
65                description: "ABC".to_string(),
66            }],
67        };
68        let val = test_into::<ValueTable>(def.trim_start(), Rule::value_table);
69        assert_eq!(val, exp);
70    }
71}