1#![doc = include_str!("../README.md")]
2
3mod ast;
4mod parser;
5
6pub use ast::*;
8#[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 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}