1#![doc = include_str!("../README.md")]
2
3#[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 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}