can_dbc/ast/
node.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::parser::{validated, DbcError};
4
5/// CAN network nodes, names must be unique
6#[derive(Clone, Debug, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct Node(pub String);
9
10impl TryFrom<Pair<'_, Rule>> for Node {
11    type Error = DbcError;
12
13    fn try_from(value: Pair<Rule>) -> Result<Self, Self::Error> {
14        Ok(Self(
15            validated(value, Rule::node_name)?.as_str().to_string(),
16        ))
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use crate::parser::collect_all;
24    use crate::test_helpers::*;
25
26    #[test]
27    fn network_node_test() {
28        let def = "
29BU_: ZU XYZ ABC OIU
30";
31        let exp = vec![
32            Node("ZU".to_string()),
33            Node("XYZ".to_string()),
34            Node("ABC".to_string()),
35            Node("OIU".to_string()),
36        ];
37        let pair = parse(def.trim_start(), Rule::nodes).unwrap();
38        let val: Vec<Node> = collect_all(&mut pair.into_inner()).unwrap();
39        assert_eq!(val, exp);
40    }
41
42    #[test]
43    fn empty_network_node_test() {
44        let def = "
45BU_:
46";
47        let pair = parse(def.trim_start(), Rule::nodes).unwrap();
48        let val: Vec<Node> = collect_all(&mut pair.into_inner()).unwrap();
49        assert_eq!(val, vec![]);
50    }
51}