can_dbc/ast/
value_table.rs1use can_dbc_pest::{Pair, Rule};
2
3use crate::ast::ValDescription;
4use crate::parser::{collect_expected, next_string, validated_inner, DbcError};
5
6#[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 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}