Skip to main content

can_dbc/
lib.rs

1#![doc = include_str!("../README.md")]
2
3// Re-export of `can_dbc_pest::encodings` to simplify usage
4#[cfg(feature = "encodings")]
5pub use can_dbc_pest::{decode_cp1252, encodings};
6
7mod ast;
8pub use ast::*;
9
10mod parser;
11pub use parser::{DbcError, DbcResult};
12
13#[cfg(test)]
14mod test_helpers {
15    use std::fmt::Debug;
16
17    use can_dbc_pest::*;
18
19    use crate::parser::*;
20
21    /// Helper function to parse a snippet with a specific rule, returning just the rule's inner content already unwrapped
22    pub fn parse(input: &str, rule: Rule) -> DbcResult<Pair<'_, Rule>> {
23        let pairs = DbcParser::parse(rule, input)?;
24        Ok(pairs.into_iter().next().unwrap())
25    }
26
27    pub fn span(input: &str, rule: Rule) -> &str {
28        let pair = parse(input, rule).unwrap();
29        pair.as_span().as_str()
30    }
31
32    pub fn test_into<'a, T>(input: &'a str, rule: Rule) -> T
33    where
34        T: TryFrom<Pair<'a, Rule>>,
35        <T as TryFrom<Pair<'a, Rule>>>::Error: Debug,
36    {
37        let pair = parse(input, rule).unwrap_or_else(|e| {
38            panic!("Parse {e:?}:\n{input:#?}");
39        });
40        pair.clone().try_into().unwrap_or_else(|e| {
41            panic!("Into {e:?}:\n{pair:#?}");
42        })
43    }
44
45    #[test]
46    fn c_ident_test() {
47        assert_eq!(span("EALL_DUSasb18 ", Rule::ident), "EALL_DUSasb18");
48        assert_eq!(span("_EALL_DUSasb18 ", Rule::ident), "_EALL_DUSasb18");
49        assert!(parse("3EALL_DUSasb18 ", Rule::ident).is_err());
50    }
51
52    #[test]
53    fn c_ident_vec_test() {
54        use crate::Symbol;
55        let def = "FZHL_DUSasb18 ";
56        let val = vec![Symbol(span(def, Rule::ident).to_string())];
57        assert_eq!(val, vec![Symbol("FZHL_DUSasb18".to_string())]);
58
59        let def = "FZHL_DUSasb19,xkask_3298 ";
60        let val = vec![Symbol(span(def, Rule::ident).to_string())];
61        assert_eq!(val, vec![Symbol("FZHL_DUSasb19".to_string())],);
62    }
63
64    #[test]
65    fn char_string_test() {
66        let def = "\"ab\x00\x7f\"";
67        let val = span(def, Rule::quoted_str);
68        assert_eq!(val, "\"ab\x00\x7f\"");
69    }
70
71    #[test]
72    fn attribute_value_f64_test() {
73        let val = span("80.0", Rule::number).parse::<f64>().unwrap();
74        assert!((val - 80.0).abs() < f64::EPSILON);
75    }
76}