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, next_string, parse_next_uint, validated_inner, DbcError};

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EnvironmentVariableData {
    pub env_var_name: String,
    pub data_size: u64,
}

impl TryFrom<Pair<'_, Rule>> for EnvironmentVariableData {
    type Error = DbcError;

    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
        let mut pairs = validated_inner(value, Rule::env_var_data)?;

        let env_var_name = next_string(&mut pairs, Rule::env_var_name)?;
        let data_size = parse_next_uint(&mut pairs, Rule::data_size)?;
        expect_empty(&pairs)?;

        Ok(Self {
            env_var_name,
            data_size,
        })
    }
}

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

    #[test]
    fn envvar_data_test() {
        let def = "
ENVVAR_DATA_ SomeEnvVarData: 399;
";
        let exp = EnvironmentVariableData {
            env_var_name: "SomeEnvVarData".to_string(),
            data_size: 399,
        };
        let val = test_into::<EnvironmentVariableData>(def.trim_start(), Rule::env_var_data);
        assert_eq!(val, exp);
    }
}