can_dbc/
lib.rs

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