can_dbc/ast/
attribute_default.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::ast::AttributeValue;
4use crate::parser::{expect_empty, next, parse_next_inner_str, DbcError};
5
6#[derive(Clone, Debug, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct AttributeDefault {
9    pub name: String,
10    pub value: AttributeValue,
11}
12
13impl TryFrom<Pair<'_, Rule>> for AttributeDefault {
14    type Error = DbcError;
15
16    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
17        let rule = value.as_rule();
18        if !matches!(rule, Rule::ba_def_def | Rule::ba_def_def_rel) {
19            return Err(DbcError::ExpectedRule(Rule::ba_def_def, rule));
20        }
21
22        let mut pairs = value.into_inner();
23        let name = parse_next_inner_str(&mut pairs, Rule::attribute_name)?;
24        let value = next(&mut pairs)?.try_into()?;
25        expect_empty(&pairs)?;
26
27        Ok(Self { name, value })
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use crate::ast::AttributeValue;
35    use crate::test_helpers::*;
36
37    #[test]
38    fn attribute_default_test() {
39        let def = r#"
40BA_DEF_DEF_  "ZUV" "OAL";
41"#;
42        let exp = AttributeDefault {
43            name: "ZUV".to_string(),
44            value: AttributeValue::String("OAL".to_string()),
45        };
46        let val = test_into::<AttributeDefault>(def.trim_start(), Rule::ba_def_def);
47        assert_eq!(val, exp);
48    }
49}