can_dbc/ast/
attribute_value.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::parser::{inner_str, DbcError};
4use crate::NumericValue;
5
6#[derive(Clone, Debug, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub enum AttributeValue {
9    Uint(u64),
10    Int(i64),
11    Double(f64),
12    String(String),
13}
14
15impl TryFrom<Pair<'_, Rule>> for AttributeValue {
16    type Error = DbcError;
17
18    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
19        match value.as_rule() {
20            Rule::quoted_str => Ok(Self::String(inner_str(value))),
21            Rule::number => Ok(match value.as_str().parse()? {
22                NumericValue::Uint(u) => Self::Uint(u),
23                NumericValue::Int(i) => Self::Int(i),
24                NumericValue::Double(d) => Self::Double(d),
25            }),
26            _ => Err(Self::Error::ExpectedStrNumber(value.as_rule())),
27        }
28    }
29}