can_dbc/ast/
symbol.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::parser::{validated, DbcError};
4
5#[derive(Clone, Debug, PartialEq)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct Symbol(pub String);
8
9impl TryFrom<Pair<'_, Rule>> for Symbol {
10    type Error = DbcError;
11
12    /// Parse new symbols: NS_ : symbol1 symbol2 ...
13    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
14        Ok(Self(validated(value, Rule::ident)?.as_str().to_string()))
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    use crate::parser::collect_all;
22    use crate::test_helpers::*;
23
24    #[test]
25    fn new_symbols_test() {
26        let def = "
27NS_ :
28    NS_DESC_
29    CM_
30    BA_DEF_
31";
32        let exp = vec![
33            Symbol("NS_DESC_".to_string()),
34            Symbol("CM_".to_string()),
35            Symbol("BA_DEF_".to_string()),
36        ];
37        let pair = parse(def.trim_start(), Rule::new_symbols).unwrap();
38        let mut pairs = pair.into_inner();
39        let val: Vec<Symbol> = collect_all(&mut pairs).unwrap();
40        assert_eq!(val, exp);
41    }
42}