can-dbc 9.0.0

A parser for the DBC format. The DBC format is used to exchange CAN network data.
Documentation
use can_dbc_pest::{Pair, Rule};

use crate::parser::{expect_empty, parse_next_inner_str, parse_next_int, validated_inner};

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ValDescription {
    pub id: i64,
    pub description: String,
}

impl TryFrom<Pair<'_, Rule>> for ValDescription {
    type Error = crate::parser::DbcError;

    fn try_from(value: Pair<Rule>) -> Result<Self, Self::Error> {
        let mut pairs = validated_inner(value, Rule::table_value_description)?;
        let id = parse_next_int(&mut pairs, Rule::int)?;
        let description = parse_next_inner_str(&mut pairs, Rule::quoted_str)?;
        expect_empty(&pairs)?;
        Ok(Self { id, description })
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::test_helpers::*;

    #[test]
    fn value_description_test() {
        let def = r#"
2 "ABC"
"#;
        let exp = ValDescription {
            id: 2,
            description: "ABC".to_string(),
        };
        let val = test_into::<ValDescription>(def.trim_start(), Rule::table_value_description);
        assert_eq!(val, exp);
    }
}