can_dbc/
parser.rs

1//!
2//! Module containing nom parser combinators
3//!
4
5use std::str;
6
7use nom::{
8    branch::{alt, permutation},
9    bytes::complete::{tag, take_till, take_while, take_while1},
10    character::complete::{self, char, line_ending, multispace0, space0, space1},
11    combinator::{map, opt, value},
12    error::{ErrorKind, ParseError},
13    multi::{many0, many_till, separated_list0},
14    number::complete::double,
15    sequence::preceded,
16    AsChar, IResult, InputTakeAtPosition,
17};
18
19use crate::{
20    AccessNode, AccessType, AttributeDefault, AttributeDefinition, AttributeValue,
21    AttributeValueForObject, AttributeValuedForObjectType, Baudrate, ByteOrder, Comment, EnvType,
22    EnvironmentVariable, EnvironmentVariableData, ExtendedMultiplex, ExtendedMultiplexMapping,
23    Message, MessageId, MessageTransmitter, MultiplexIndicator, Node, Signal,
24    SignalExtendedValueType, SignalExtendedValueTypeList, SignalGroups, SignalType, SignalTypeRef,
25    Symbol, Transmitter, ValDescription, ValueDescription, ValueTable, ValueType, Version, DBC,
26};
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn c_ident_test() {
34        let def1 = "EALL_DUSasb18 ";
35        let (_, cid1) = c_ident(def1).unwrap();
36        assert_eq!("EALL_DUSasb18", cid1);
37
38        let def2 = "_EALL_DUSasb18 ";
39        let (_, cid2) = c_ident(def2).unwrap();
40        assert_eq!("_EALL_DUSasb18", cid2);
41
42        // identifiers must not start with digit1s
43        let def3 = "3EALL_DUSasb18 ";
44        let cid3_result = c_ident(def3);
45        assert!(cid3_result.is_err());
46    }
47
48    #[test]
49    fn c_ident_vec_test() {
50        let cid = "FZHL_DUSasb18 ";
51        let (_, cid1) = c_ident_vec(cid).unwrap();
52
53        assert_eq!(vec!("FZHL_DUSasb18".to_string()), cid1);
54
55        let cid_vec = "FZHL_DUSasb19,xkask_3298 ";
56        let (_, cid2) = c_ident_vec(cid_vec).unwrap();
57
58        assert_eq!(
59            vec!("FZHL_DUSasb19".to_string(), "xkask_3298".to_string()),
60            cid2
61        );
62    }
63
64    #[test]
65    fn char_string_test() {
66        let def = "\"ab\x00\x7f\"";
67        let (_, char_string) = char_string(def).unwrap();
68        let exp = "ab\x00\x7f";
69        assert_eq!(exp, char_string);
70    }
71
72    #[test]
73    fn signal_test() {
74        let signal_line = "SG_ NAME : 3|2@1- (1,0) [0|0] \"x\" UFA\r\n";
75        let _signal = signal(signal_line).unwrap();
76    }
77
78    #[test]
79    fn byte_order_test() {
80        let (_, big_endian) = byte_order("0").expect("Failed to parse big endian");
81        assert_eq!(ByteOrder::BigEndian, big_endian);
82
83        let (_, little_endian) = byte_order("1").expect("Failed to parse little endian");
84        assert_eq!(ByteOrder::LittleEndian, little_endian);
85    }
86
87    #[test]
88    fn multiplexer_indicator_test() {
89        let (_, multiplexer) =
90            multiplexer_indicator(" m34920 eol").expect("Failed to parse multiplexer");
91        assert_eq!(MultiplexIndicator::MultiplexedSignal(34920), multiplexer);
92
93        let (_, multiplexor) =
94            multiplexer_indicator(" M eol").expect("Failed to parse multiplexor");
95        assert_eq!(MultiplexIndicator::Multiplexor, multiplexor);
96
97        let (_, plain) = multiplexer_indicator(" eol").expect("Failed to parse plain");
98        assert_eq!(MultiplexIndicator::Plain, plain);
99
100        let (_, multiplexer) =
101            multiplexer_indicator(" m8M eol").expect("Failed to parse multiplexer");
102        assert_eq!(
103            MultiplexIndicator::MultiplexorAndMultiplexedSignal(8),
104            multiplexer
105        );
106    }
107
108    #[test]
109    fn value_type_test() {
110        let (_, vt) = value_type("- ").expect("Failed to parse value type");
111        assert_eq!(ValueType::Signed, vt);
112
113        let (_, vt) = value_type("+ ").expect("Failed to parse value type");
114        assert_eq!(ValueType::Unsigned, vt);
115    }
116
117    #[test]
118    fn message_definition_test() {
119        let def = "BO_ 1 MCA_A1: 6 MFA\r\nSG_ ABC_1 : 9|2@1+ (1,0) [0|0] \"x\" XYZ_OUS\r\nSG_ BasL2 : 3|2@0- (1,0) [0|0] \"x\" DFA_FUS\r\n x";
120        signal("\r\n\r\nSG_ BasL2 : 3|2@0- (1,0) [0|0] \"x\" DFA_FUS\r\n").expect("Failed");
121        let (_, _message_def) = message(def).expect("Failed to parse message definition");
122    }
123
124    #[test]
125    fn signal_comment_test() {
126        let def1 = "CM_ SG_ 193 KLU_R_X \"This is a signal comment test\";\n";
127        let message_id = MessageId::Standard(193);
128        let comment1 = Comment::Signal {
129            message_id,
130            signal_name: "KLU_R_X".to_string(),
131            comment: "This is a signal comment test".to_string(),
132        };
133        let (_, comment1_def) = comment(def1).expect("Failed to parse signal comment definition");
134        assert_eq!(comment1, comment1_def);
135    }
136
137    #[test]
138    fn message_definition_comment_test() {
139        let def1 = "CM_ BO_ 34544 \"Some Message comment\";\n";
140        let message_id = MessageId::Standard(34544);
141        let comment1 = Comment::Message {
142            message_id,
143            comment: "Some Message comment".to_string(),
144        };
145        let (_, comment1_def) =
146            comment(def1).expect("Failed to parse message definition comment definition");
147        assert_eq!(comment1, comment1_def);
148    }
149
150    #[test]
151    fn node_comment_test() {
152        let def1 = "CM_ BU_ network_node \"Some network node comment\";\n";
153        let comment1 = Comment::Node {
154            node_name: "network_node".to_string(),
155            comment: "Some network node comment".to_string(),
156        };
157        let (_, comment1_def) = comment(def1).expect("Failed to parse node comment definition");
158        assert_eq!(comment1, comment1_def);
159    }
160
161    #[test]
162    fn env_var_comment_test() {
163        let def1 = "CM_ EV_ ENVXYZ \"Some env var name comment\";\n";
164        let comment1 = Comment::EnvVar {
165            env_var_name: "ENVXYZ".to_string(),
166            comment: "Some env var name comment".to_string(),
167        };
168        let (_, comment1_def) = comment(def1).expect("Failed to parse env var comment definition");
169        assert_eq!(comment1, comment1_def);
170    }
171
172    #[test]
173    fn value_description_for_signal_test() {
174        let def1 = "VAL_ 837 UF_HZ_OI 255 \"NOP\";\n";
175        let message_id = MessageId::Standard(837);
176        let signal_name = "UF_HZ_OI".to_string();
177        let val_descriptions = vec![ValDescription {
178            a: 255.0,
179            b: "NOP".to_string(),
180        }];
181        let value_description_for_signal1 = ValueDescription::Signal {
182            message_id,
183            signal_name,
184            value_descriptions: val_descriptions,
185        };
186        let (_, value_signal_def) =
187            value_descriptions(def1).expect("Failed to parse value desc for signal");
188        assert_eq!(value_description_for_signal1, value_signal_def);
189    }
190
191    #[test]
192    fn value_description_for_env_var_test() {
193        let def1 = "VAL_ MY_ENV_VAR 255 \"NOP\";\n";
194        let env_var_name = "MY_ENV_VAR".to_string();
195        let val_descriptions = vec![ValDescription {
196            a: 255.0,
197            b: "NOP".to_string(),
198        }];
199        let value_env_var1 = ValueDescription::EnvironmentVariable {
200            env_var_name,
201            value_descriptions: val_descriptions,
202        };
203        let (_, value_env_var) =
204            value_descriptions(def1).expect("Failed to parse value desc for env var");
205        assert_eq!(value_env_var1, value_env_var);
206    }
207
208    #[test]
209    fn environment_variable_test() {
210        let def1 = "EV_ IUV: 0 [-22|20] \"mm\" 3 7 DUMMY_NODE_VECTOR0 VECTOR_XXX;\n";
211        let env_var1 = EnvironmentVariable {
212            env_var_name: "IUV".to_string(),
213            env_var_type: EnvType::EnvTypeFloat,
214            min: -22,
215            max: 20,
216            unit: "mm".to_string(),
217            initial_value: 3.0,
218            ev_id: 7,
219            access_type: AccessType::DummyNodeVector0,
220            access_nodes: vec![AccessNode::AccessNodeVectorXXX],
221        };
222        let (_, env_var) =
223            environment_variable(def1).expect("Failed to parse environment variable");
224        assert_eq!(env_var1, env_var);
225    }
226
227    #[test]
228    fn network_node_attribute_value_test() {
229        let def = "BA_ \"AttrName\" BU_ NodeName 12;\n";
230        let attribute_value = AttributeValuedForObjectType::NetworkNodeAttributeValue(
231            "NodeName".to_string(),
232            AttributeValue::AttributeValueF64(12.0),
233        );
234        let attr_val_exp = AttributeValueForObject {
235            attribute_name: "AttrName".to_string(),
236            attribute_value,
237        };
238        let (_, attr_val) = attribute_value_for_object(def).unwrap();
239        assert_eq!(attr_val_exp, attr_val);
240    }
241
242    #[test]
243    fn message_definition_attribute_value_test() {
244        let def = "BA_ \"AttrName\" BO_ 298 13;\n";
245        let attribute_value = AttributeValuedForObjectType::MessageDefinitionAttributeValue(
246            MessageId::Standard(298),
247            Some(AttributeValue::AttributeValueF64(13.0)),
248        );
249        let attr_val_exp = AttributeValueForObject {
250            attribute_name: "AttrName".to_string(),
251            attribute_value,
252        };
253        let (_, attr_val) = attribute_value_for_object(def).unwrap();
254        assert_eq!(attr_val_exp, attr_val);
255    }
256
257    #[test]
258    fn signal_attribute_value_test() {
259        let def = "BA_ \"AttrName\" SG_ 198 SGName 13;\n";
260        let attribute_value = AttributeValuedForObjectType::SignalAttributeValue(
261            MessageId::Standard(198),
262            "SGName".to_string(),
263            AttributeValue::AttributeValueF64(13.0),
264        );
265        let attr_val_exp = AttributeValueForObject {
266            attribute_name: "AttrName".to_string(),
267            attribute_value,
268        };
269        let (_, attr_val) = attribute_value_for_object(def).unwrap();
270        assert_eq!(attr_val_exp, attr_val);
271    }
272
273    #[test]
274    fn env_var_attribute_value_test() {
275        let def = "BA_ \"AttrName\" EV_ EvName \"CharStr\";\n";
276        let attribute_value = AttributeValuedForObjectType::EnvVariableAttributeValue(
277            "EvName".to_string(),
278            AttributeValue::AttributeValueCharString("CharStr".to_string()),
279        );
280        let attr_val_exp = AttributeValueForObject {
281            attribute_name: "AttrName".to_string(),
282            attribute_value,
283        };
284        let (_, attr_val) = attribute_value_for_object(def).unwrap();
285        assert_eq!(attr_val_exp, attr_val);
286    }
287
288    #[test]
289    fn raw_attribute_value_test() {
290        let def = "BA_ \"AttrName\" \"RAW\";\n";
291        let attribute_value = AttributeValuedForObjectType::RawAttributeValue(
292            AttributeValue::AttributeValueCharString("RAW".to_string()),
293        );
294        let attr_val_exp = AttributeValueForObject {
295            attribute_name: "AttrName".to_string(),
296            attribute_value,
297        };
298        let (_, attr_val) = attribute_value_for_object(def).unwrap();
299        assert_eq!(attr_val_exp, attr_val);
300    }
301
302    #[test]
303    fn new_symbols_test() {
304        let def = "NS_ :
305                NS_DESC_
306                CM_
307                BA_DEF_
308
309            ";
310        let symbols_exp = vec![
311            Symbol("NS_DESC_".to_string()),
312            Symbol("CM_".to_string()),
313            Symbol("BA_DEF_".to_string()),
314        ];
315        let (_, symbols) = new_symbols(def).unwrap();
316        assert_eq!(symbols_exp, symbols);
317    }
318
319    #[test]
320    fn network_node_test() {
321        let def = "BU_: ZU XYZ ABC OIU\n";
322        let nodes = vec![
323            "ZU".to_string(),
324            "XYZ".to_string(),
325            "ABC".to_string(),
326            "OIU".to_string(),
327        ];
328        let (_, node) = node(def).unwrap();
329        let node_exp = Node(nodes);
330        assert_eq!(node_exp, node);
331    }
332
333    #[test]
334    fn empty_network_node_test() {
335        let def = "BU_: \n";
336        let nodes = vec![];
337        let (_, node) = node(def).unwrap();
338        let node_exp = Node(nodes);
339        assert_eq!(node_exp, node);
340    }
341
342    #[test]
343    fn envvar_data_test() {
344        let def = "ENVVAR_DATA_ SomeEnvVarData: 399;\n";
345        let (_, envvar_data) = environment_variable_data(def).unwrap();
346        let envvar_data_exp = EnvironmentVariableData {
347            env_var_name: "SomeEnvVarData".to_string(),
348            data_size: 399,
349        };
350        assert_eq!(envvar_data_exp, envvar_data);
351    }
352
353    #[test]
354    fn signal_type_test() {
355        let def = "SGTYPE_ signal_type_name: 1024@1+ (5,2) [1|3] \"unit\" 2.0 val_table;\n";
356
357        let exp = SignalType {
358            signal_type_name: "signal_type_name".to_string(),
359            signal_size: 1024,
360            byte_order: ByteOrder::LittleEndian,
361            value_type: ValueType::Unsigned,
362            factor: 5.0,
363            offset: 2.0,
364            min: 1.0,
365            max: 3.0,
366            unit: "unit".to_string(),
367            default_value: 2.0,
368            value_table: "val_table".to_string(),
369        };
370
371        let (_, signal_type) = signal_type(def).unwrap();
372        assert_eq!(exp, signal_type);
373    }
374
375    #[test]
376    fn signal_groups_test() {
377        let def = "SIG_GROUP_ 23 X_3290 1 : A_b XY_Z;\n";
378
379        let exp = SignalGroups {
380            message_id: MessageId::Standard(23),
381            signal_group_name: "X_3290".to_string(),
382            repetitions: 1,
383            signal_names: vec!["A_b".to_string(), "XY_Z".to_string()],
384        };
385
386        let (_, signal_groups) = signal_groups(def).unwrap();
387        assert_eq!(exp, signal_groups);
388    }
389
390    #[test]
391    fn attribute_default_test() {
392        let def = "BA_DEF_DEF_  \"ZUV\" \"OAL\";\n";
393        let (_, attr_default) = attribute_default(def).unwrap();
394        let attr_default_exp = AttributeDefault {
395            attribute_name: "ZUV".to_string(),
396            attribute_value: AttributeValue::AttributeValueCharString("OAL".to_string()),
397        };
398        assert_eq!(attr_default_exp, attr_default);
399    }
400
401    #[test]
402    fn attribute_value_f64_test() {
403        let def = "80.0";
404        let (_, val) = attribute_value(def).unwrap();
405        assert_eq!(AttributeValue::AttributeValueF64(80.0), val);
406    }
407
408    #[test]
409    fn attribute_definition_test() {
410        let def_bo = "BA_DEF_ BO_ \"BaDef1BO\" INT 0 1000000;\n";
411        let (_, bo_def) = attribute_definition(def_bo).unwrap();
412        let bo_def_exp = AttributeDefinition::Message("\"BaDef1BO\" INT 0 1000000".to_string());
413        assert_eq!(bo_def_exp, bo_def);
414
415        let def_bu = "BA_DEF_ BU_ \"BuDef1BO\" INT 0 1000000;\n";
416        let (_, bu_def) = attribute_definition(def_bu).unwrap();
417        let bu_def_exp = AttributeDefinition::Node("\"BuDef1BO\" INT 0 1000000".to_string());
418        assert_eq!(bu_def_exp, bu_def);
419
420        let def_signal = "BA_DEF_ SG_ \"SgDef1BO\" INT 0 1000000;\n";
421        let (_, signal_def) = attribute_definition(def_signal).unwrap();
422        let signal_def_exp = AttributeDefinition::Signal("\"SgDef1BO\" INT 0 1000000".to_string());
423        assert_eq!(signal_def_exp, signal_def);
424
425        let def_env_var = "BA_DEF_ EV_ \"EvDef1BO\" INT 0 1000000;\n";
426        let (_, env_var_def) = attribute_definition(def_env_var).unwrap();
427        let env_var_def_exp =
428            AttributeDefinition::EnvironmentVariable("\"EvDef1BO\" INT 0 1000000".to_string());
429        assert_eq!(env_var_def_exp, env_var_def);
430    }
431
432    #[test]
433    fn version_test() {
434        let def = "VERSION \"HNPBNNNYNNNNNNNNNNNNNNNNNNNNNNNNYNYYYYYYYY>4>%%%/4>'%**4YYY///\"\n";
435        let version_exp =
436            Version("HNPBNNNYNNNNNNNNNNNNNNNNNNNNNNNNYNYYYYYYYY>4>%%%/4>'%**4YYY///".to_string());
437        let (_, version) = version(def).unwrap();
438        assert_eq!(version_exp, version);
439    }
440
441    #[test]
442    fn message_transmitters_test() {
443        let def = "BO_TX_BU_ 12345 : XZY,ABC;\n";
444        let exp = MessageTransmitter {
445            message_id: MessageId::Standard(12345),
446            transmitter: vec![
447                Transmitter::NodeName("XZY".to_string()),
448                Transmitter::NodeName("ABC".to_string()),
449            ],
450        };
451        let (_, transmitter) = message_transmitter(def).unwrap();
452        assert_eq!(exp, transmitter);
453    }
454
455    #[test]
456    fn value_description_test() {
457        let def = "2 \"ABC\"\n";
458        let exp = ValDescription {
459            a: 2f64,
460            b: "ABC".to_string(),
461        };
462        let (_, val_desc) = value_description(def).unwrap();
463        assert_eq!(exp, val_desc);
464    }
465
466    #[test]
467    fn val_table_test() {
468        let def = "VAL_TABLE_ Tst 2 \"ABC\" 1 \"Test A\" ;\n";
469        let exp = ValueTable {
470            value_table_name: "Tst".to_string(),
471            value_descriptions: vec![
472                ValDescription {
473                    a: 2f64,
474                    b: "ABC".to_string(),
475                },
476                ValDescription {
477                    a: 1f64,
478                    b: "Test A".to_string(),
479                },
480            ],
481        };
482        let (_, val_table) = value_table(def).unwrap();
483        assert_eq!(exp, val_table);
484    }
485
486    #[test]
487    fn val_table_no_space_preceding_comma_test() {
488        let def = "VAL_TABLE_ Tst 2 \"ABC\";\n";
489        let exp = ValueTable {
490            value_table_name: "Tst".to_string(),
491            value_descriptions: vec![ValDescription {
492                a: 2f64,
493                b: "ABC".to_string(),
494            }],
495        };
496        let (_, val_table) = value_table(def).unwrap();
497        assert_eq!(exp, val_table);
498    }
499
500    #[test]
501    fn extended_multiplex_test() {
502        // simple mapping
503        let def = "SG_MUL_VAL_ 2147483650 muxed_A_1 MUX_A 1-1;\n";
504        let exp = ExtendedMultiplex {
505            message_id: MessageId::Extended(2),
506            signal_name: "muxed_A_1".to_string(),
507            multiplexor_signal_name: "MUX_A".to_string(),
508            mappings: vec![ExtendedMultiplexMapping {
509                min_value: 1,
510                max_value: 1,
511            }],
512        };
513        let (_, ext_multiplex) = extended_multiplex(def).unwrap();
514        assert_eq!(exp, ext_multiplex);
515
516        // range mapping
517        let def = "SG_MUL_VAL_ 2147483650 muxed_A_1 MUX_A 1568-2568;\n";
518        let exp = ExtendedMultiplex {
519            message_id: MessageId::Extended(2),
520            signal_name: "muxed_A_1".to_string(),
521            multiplexor_signal_name: "MUX_A".to_string(),
522            mappings: vec![ExtendedMultiplexMapping {
523                min_value: 1568,
524                max_value: 2568,
525            }],
526        };
527        let (_, ext_multiplex) = extended_multiplex(def).unwrap();
528        assert_eq!(exp, ext_multiplex);
529
530        // multiple mappings
531        let def = "SG_MUL_VAL_ 2147483650 muxed_B_5 MUX_B 5-5, 16-24;\n";
532        let exp = ExtendedMultiplex {
533            message_id: MessageId::Extended(2),
534            signal_name: "muxed_B_5".to_string(),
535            multiplexor_signal_name: "MUX_B".to_string(),
536            mappings: vec![
537                ExtendedMultiplexMapping {
538                    min_value: 5,
539                    max_value: 5,
540                },
541                ExtendedMultiplexMapping {
542                    min_value: 16,
543                    max_value: 24,
544                },
545            ],
546        };
547        let (_, ext_multiplex) = extended_multiplex(def).unwrap();
548        assert_eq!(exp, ext_multiplex);
549    }
550
551    #[test]
552    fn sig_val_type_test() {
553        let def = "SIG_VALTYPE_ 2000 Signal_8 : 1;\n";
554        let exp = SignalExtendedValueTypeList {
555            message_id: MessageId::Standard(2000),
556            signal_name: "Signal_8".to_string(),
557            signal_extended_value_type: SignalExtendedValueType::IEEEfloat32Bit,
558        };
559
560        let (_, extended_value_type_list) = signal_extended_value_type_list(def).unwrap();
561        assert_eq!(extended_value_type_list, exp);
562    }
563
564    #[test]
565    fn standard_message_id_test() {
566        let (_, extended_message_id) = message_id("2").unwrap();
567        assert_eq!(extended_message_id, MessageId::Standard(2));
568    }
569
570    #[test]
571    fn extended_low_message_id_test() {
572        let s = (2u32 | 1 << 31).to_string();
573        let (_, extended_message_id) = message_id(&s).unwrap();
574        assert_eq!(extended_message_id, MessageId::Extended(2));
575    }
576
577    #[test]
578    fn extended_message_id_test() {
579        let s = (0x1FFFFFFFu32 | 1 << 31).to_string();
580        let (_, extended_message_id) = message_id(&s).unwrap();
581        assert_eq!(extended_message_id, MessageId::Extended(0x1FFFFFFF));
582    }
583
584    #[test]
585    fn extended_message_id_test_max_29bit() {
586        let s = u32::MAX.to_string();
587        let (_, extended_message_id) = message_id(&s).unwrap();
588        assert_eq!(extended_message_id, MessageId::Extended(0x1FFFFFFF));
589    }
590}
591
592fn is_semi_colon(chr: char) -> bool {
593    chr == ';'
594}
595
596fn is_c_string_char(chr: char) -> bool {
597    chr.is_ascii_digit() || chr.is_alphabetic() || chr == '_'
598}
599
600fn is_c_ident_head(chr: char) -> bool {
601    chr.is_alphabetic() || chr == '_'
602}
603
604fn is_quote(chr: char) -> bool {
605    chr == '"'
606}
607
608/// Multispace zero or more
609fn ms0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
610where
611    T: InputTakeAtPosition,
612    <T as InputTakeAtPosition>::Item: AsChar + Clone,
613{
614    input.split_at_position_complete(|item| {
615        let c = item.as_char();
616        c != ' '
617    })
618}
619
620/// Multi space one or more
621fn ms1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
622where
623    T: InputTakeAtPosition,
624    <T as InputTakeAtPosition>::Item: AsChar + Clone,
625{
626    input.split_at_position1_complete(
627        |item| {
628            let c = item.as_char();
629            c != ' '
630        },
631        ErrorKind::MultiSpace,
632    )
633}
634
635/// Colon aka `:`
636fn colon(s: &str) -> IResult<&str, char> {
637    char(':')(s)
638}
639
640/// Comma aka ','
641fn comma(s: &str) -> IResult<&str, char> {
642    char(',')(s)
643}
644
645/// Comma aka ';'
646fn semi_colon(s: &str) -> IResult<&str, char> {
647    char(';')(s)
648}
649
650/// Quote aka '"'
651fn quote(s: &str) -> IResult<&str, char> {
652    char('"')(s)
653}
654
655/// Pipe character
656fn pipe(s: &str) -> IResult<&str, char> {
657    char('|')(s)
658}
659
660/// at character
661fn at(s: &str) -> IResult<&str, char> {
662    char('@')(s)
663}
664
665/// brace open aka '('
666fn brc_open(s: &str) -> IResult<&str, char> {
667    char('(')(s)
668}
669
670/// brace close aka ')'
671fn brc_close(s: &str) -> IResult<&str, char> {
672    char(')')(s)
673}
674
675/// bracket open aka '['
676fn brk_open(s: &str) -> IResult<&str, char> {
677    char('[')(s)
678}
679
680/// bracket close aka ']'
681fn brk_close(s: &str) -> IResult<&str, char> {
682    char(']')(s)
683}
684
685/// A valid C_identifier. C_identifiers start with a  alphacharacter or an underscore
686/// and may further consist of alpha­numeric, characters and underscore
687fn c_ident(s: &str) -> IResult<&str, String> {
688    let (s, head) = take_while1(is_c_ident_head)(s)?;
689    let (s, remaining) = take_while(is_c_string_char)(s)?;
690    Ok((s, [head, remaining].concat()))
691}
692
693fn c_ident_vec(s: &str) -> IResult<&str, Vec<String>> {
694    separated_list0(comma, c_ident)(s)
695}
696
697fn char_string(s: &str) -> IResult<&str, &str> {
698    let (s, _) = quote(s)?;
699    let (s, char_string_value) = take_till(is_quote)(s)?;
700    let (s, _) = quote(s)?;
701    Ok((s, char_string_value))
702}
703
704fn little_endian(s: &str) -> IResult<&str, ByteOrder> {
705    map(char('1'), |_| ByteOrder::LittleEndian)(s)
706}
707
708fn big_endian(s: &str) -> IResult<&str, ByteOrder> {
709    map(char('0'), |_| ByteOrder::BigEndian)(s)
710}
711
712fn byte_order(s: &str) -> IResult<&str, ByteOrder> {
713    alt((little_endian, big_endian))(s)
714}
715
716fn message_id(s: &str) -> IResult<&str, MessageId> {
717    let (s, parsed_value) = complete::u32(s)?;
718
719    if parsed_value & (1 << 31) != 0 {
720        Ok((s, MessageId::Extended(parsed_value & 0x1FFFFFFF)))
721    } else {
722        Ok((s, MessageId::Standard(parsed_value as u16)))
723    }
724}
725
726fn signed(s: &str) -> IResult<&str, ValueType> {
727    map(char('-'), |_| ValueType::Signed)(s)
728}
729
730fn unsigned(s: &str) -> IResult<&str, ValueType> {
731    map(char('+'), |_| ValueType::Unsigned)(s)
732}
733
734fn value_type(s: &str) -> IResult<&str, ValueType> {
735    alt((signed, unsigned))(s)
736}
737
738fn multiplexer(s: &str) -> IResult<&str, MultiplexIndicator> {
739    let (s, _) = ms1(s)?;
740    let (s, _) = char('m')(s)?;
741    let (s, d) = complete::u64(s)?;
742    let (s, _) = ms1(s)?;
743    Ok((s, MultiplexIndicator::MultiplexedSignal(d)))
744}
745
746fn multiplexor(s: &str) -> IResult<&str, MultiplexIndicator> {
747    let (s, _) = ms1(s)?;
748    let (s, _) = char('M')(s)?;
749    let (s, _) = ms1(s)?;
750    Ok((s, MultiplexIndicator::Multiplexor))
751}
752
753fn multiplexor_and_multiplexed(s: &str) -> IResult<&str, MultiplexIndicator> {
754    let (s, _) = ms1(s)?;
755    let (s, _) = char('m')(s)?;
756    let (s, d) = complete::u64(s)?;
757    let (s, _) = char('M')(s)?;
758    let (s, _) = ms1(s)?;
759    Ok((s, MultiplexIndicator::MultiplexorAndMultiplexedSignal(d)))
760}
761
762fn plain(s: &str) -> IResult<&str, MultiplexIndicator> {
763    let (s, _) = ms1(s)?;
764    Ok((s, MultiplexIndicator::Plain))
765}
766
767fn multiplexer_indicator(s: &str) -> IResult<&str, MultiplexIndicator> {
768    alt((multiplexer, multiplexor, multiplexor_and_multiplexed, plain))(s)
769}
770
771fn version(s: &str) -> IResult<&str, Version> {
772    let (s, _) = multispace0(s)?;
773    let (s, _) = tag("VERSION")(s)?;
774    let (s, _) = ms1(s)?;
775    let (s, v) = char_string(s)?;
776    let (s, _) = line_ending(s)?;
777    Ok((s, Version(v.to_string())))
778}
779
780fn bit_timing(s: &str) -> IResult<&str, Vec<Baudrate>> {
781    let (s, _) = multispace0(s)?;
782    let (s, _) = tag("BS_:")(s)?;
783    let (s, baudrates) = opt(preceded(
784        ms1,
785        separated_list0(comma, map(complete::u64, Baudrate)),
786    ))(s)?;
787    Ok((s, baudrates.unwrap_or_default()))
788}
789
790fn signal(s: &str) -> IResult<&str, Signal> {
791    let (s, _) = multispace0(s)?;
792    let (s, _) = tag("SG_")(s)?;
793    let (s, _) = ms1(s)?;
794    let (s, name) = c_ident(s)?;
795    let (s, multiplexer_indicator) = multiplexer_indicator(s)?;
796    let (s, _) = colon(s)?;
797    let (s, _) = ms1(s)?;
798    let (s, start_bit) = complete::u64(s)?;
799    let (s, _) = pipe(s)?;
800    let (s, signal_size) = complete::u64(s)?;
801    let (s, _) = at(s)?;
802    let (s, byte_order) = byte_order(s)?;
803    let (s, value_type) = value_type(s)?;
804    let (s, _) = ms1(s)?;
805    let (s, _) = brc_open(s)?;
806    let (s, factor) = double(s)?;
807    let (s, _) = comma(s)?;
808    let (s, offset) = double(s)?;
809    let (s, _) = brc_close(s)?;
810    let (s, _) = ms1(s)?;
811    let (s, _) = brk_open(s)?;
812    let (s, min) = double(s)?;
813    let (s, _) = pipe(s)?;
814    let (s, max) = double(s)?;
815    let (s, _) = brk_close(s)?;
816    let (s, _) = ms1(s)?;
817    let (s, unit) = char_string(s)?;
818    let (s, _) = ms1(s)?;
819    let (s, receivers) = c_ident_vec(s)?;
820    let (s, _) = line_ending(s)?;
821    Ok((
822        s,
823        Signal {
824            name,
825            multiplexer_indicator,
826            start_bit,
827            signal_size,
828            byte_order,
829            value_type,
830            factor,
831            offset,
832            min,
833            max,
834            unit: unit.to_string(),
835            receivers,
836        },
837    ))
838}
839
840fn message(s: &str) -> IResult<&str, Message> {
841    let (s, _) = multispace0(s)?;
842    let (s, _) = tag("BO_")(s)?;
843    let (s, _) = ms1(s)?;
844    let (s, message_id) = message_id(s)?;
845    let (s, _) = ms1(s)?;
846    let (s, message_name) = c_ident(s)?;
847    let (s, _) = colon(s)?;
848    let (s, _) = ms1(s)?;
849    let (s, message_size) = complete::u64(s)?;
850    let (s, _) = ms1(s)?;
851    let (s, transmitter) = transmitter(s)?;
852    let (s, signals) = many0(signal)(s)?;
853    Ok((
854        s,
855        (Message {
856            message_id,
857            message_name,
858            message_size,
859            transmitter,
860            signals,
861        }),
862    ))
863}
864
865fn attribute_default(s: &str) -> IResult<&str, AttributeDefault> {
866    let (s, _) = multispace0(s)?;
867    let (s, _) = tag("BA_DEF_DEF_")(s)?;
868    let (s, _) = ms1(s)?;
869    let (s, attribute_name) = char_string(s)?;
870    let (s, _) = ms1(s)?;
871    let (s, attribute_value) = attribute_value(s)?;
872    let (s, _) = semi_colon(s)?;
873    let (s, _) = line_ending(s)?;
874
875    Ok((
876        s,
877        AttributeDefault {
878            attribute_name: attribute_name.to_string(),
879            attribute_value,
880        },
881    ))
882}
883
884fn node_comment(s: &str) -> IResult<&str, Comment> {
885    let (s, _) = tag("BU_")(s)?;
886    let (s, _) = ms1(s)?;
887    let (s, node_name) = c_ident(s)?;
888    let (s, _) = ms1(s)?;
889    let (s, comment) = char_string(s)?;
890
891    Ok((
892        s,
893        Comment::Node {
894            node_name,
895            comment: comment.to_string(),
896        },
897    ))
898}
899
900fn message_comment(s: &str) -> IResult<&str, Comment> {
901    let (s, _) = tag("BO_")(s)?;
902    let (s, _) = ms1(s)?;
903    let (s, message_id) = message_id(s)?;
904    let (s, _) = ms1(s)?;
905    let (s, comment) = char_string(s)?;
906
907    Ok((
908        s,
909        Comment::Message {
910            message_id,
911            comment: comment.to_string(),
912        },
913    ))
914}
915
916fn signal_comment(s: &str) -> IResult<&str, Comment> {
917    let (s, _) = tag("SG_")(s)?;
918    let (s, _) = ms1(s)?;
919    let (s, message_id) = message_id(s)?;
920    let (s, _) = ms1(s)?;
921    let (s, signal_name) = c_ident(s)?;
922    let (s, _) = ms1(s)?;
923    let (s, comment) = char_string(s)?;
924    Ok((
925        s,
926        Comment::Signal {
927            message_id,
928            signal_name,
929            comment: comment.to_string(),
930        },
931    ))
932}
933
934fn env_var_comment(s: &str) -> IResult<&str, Comment> {
935    let (s, _) = ms0(s)?;
936    let (s, _) = tag("EV_")(s)?;
937    let (s, _) = ms1(s)?;
938    let (s, env_var_name) = c_ident(s)?;
939    let (s, _) = ms1(s)?;
940    let (s, comment) = char_string(s)?;
941    Ok((
942        s,
943        Comment::EnvVar {
944            env_var_name,
945            comment: comment.to_string(),
946        },
947    ))
948}
949
950fn comment_plain(s: &str) -> IResult<&str, Comment> {
951    let (s, comment) = char_string(s)?;
952    Ok((
953        s,
954        Comment::Plain {
955            comment: comment.to_string(),
956        },
957    ))
958}
959
960fn comment(s: &str) -> IResult<&str, Comment> {
961    let (s, _) = multispace0(s)?;
962    let (s, _) = tag("CM_")(s)?;
963    let (s, _) = ms1(s)?;
964    let (s, comment) = alt((
965        node_comment,
966        message_comment,
967        env_var_comment,
968        signal_comment,
969        comment_plain,
970    ))(s)?;
971    let (s, _) = semi_colon(s)?;
972    let (s, _) = line_ending(s)?;
973    Ok((s, comment))
974}
975
976fn value_description(s: &str) -> IResult<&str, ValDescription> {
977    let (s, a) = double(s)?;
978    let (s, _) = ms1(s)?;
979    let (s, b) = char_string(s)?;
980    Ok((
981        s,
982        ValDescription {
983            a,
984            b: b.to_string(),
985        },
986    ))
987}
988
989fn value_description_for_signal(s: &str) -> IResult<&str, ValueDescription> {
990    let (s, _) = ms0(s)?;
991    let (s, _) = tag("VAL_")(s)?;
992    let (s, _) = ms1(s)?;
993    let (s, message_id) = message_id(s)?;
994    let (s, _) = ms1(s)?;
995    let (s, signal_name) = c_ident(s)?;
996    let (s, value_descriptions) = many_till(
997        preceded(ms1, value_description),
998        preceded(opt(ms1), semi_colon),
999    )(s)?;
1000    Ok((
1001        s,
1002        ValueDescription::Signal {
1003            message_id,
1004            signal_name,
1005            value_descriptions: value_descriptions.0,
1006        },
1007    ))
1008}
1009
1010fn value_description_for_env_var(s: &str) -> IResult<&str, ValueDescription> {
1011    let (s, _) = ms0(s)?;
1012    let (s, _) = tag("VAL_")(s)?;
1013    let (s, _) = ms1(s)?;
1014    let (s, env_var_name) = c_ident(s)?;
1015    let (s, value_descriptions) = many_till(
1016        preceded(ms1, value_description),
1017        preceded(opt(ms1), semi_colon),
1018    )(s)?;
1019    Ok((
1020        s,
1021        ValueDescription::EnvironmentVariable {
1022            env_var_name,
1023            value_descriptions: value_descriptions.0,
1024        },
1025    ))
1026}
1027
1028fn value_descriptions(s: &str) -> IResult<&str, ValueDescription> {
1029    let (s, _) = multispace0(s)?;
1030    let (s, vd) = alt((value_description_for_signal, value_description_for_env_var))(s)?;
1031    let (s, _) = line_ending(s)?;
1032    Ok((s, vd))
1033}
1034
1035fn env_float(s: &str) -> IResult<&str, EnvType> {
1036    value(EnvType::EnvTypeFloat, char('0'))(s)
1037}
1038
1039fn env_int(s: &str) -> IResult<&str, EnvType> {
1040    value(EnvType::EnvTypeu64, char('1'))(s)
1041}
1042
1043fn env_data(s: &str) -> IResult<&str, EnvType> {
1044    value(EnvType::EnvTypeu64, char('2'))(s)
1045}
1046
1047fn env_var_type(s: &str) -> IResult<&str, EnvType> {
1048    alt((env_float, env_int, env_data))(s)
1049}
1050
1051fn dummy_node_vector_0(s: &str) -> IResult<&str, AccessType> {
1052    value(AccessType::DummyNodeVector0, char('0'))(s)
1053}
1054
1055fn dummy_node_vector_1(s: &str) -> IResult<&str, AccessType> {
1056    value(AccessType::DummyNodeVector1, char('1'))(s)
1057}
1058
1059fn dummy_node_vector_2(s: &str) -> IResult<&str, AccessType> {
1060    value(AccessType::DummyNodeVector2, char('2'))(s)
1061}
1062fn dummy_node_vector_3(s: &str) -> IResult<&str, AccessType> {
1063    value(AccessType::DummyNodeVector3, char('3'))(s)
1064}
1065
1066fn access_type(s: &str) -> IResult<&str, AccessType> {
1067    let (s, _) = tag("DUMMY_NODE_VECTOR")(s)?;
1068    let (s, node) = alt((
1069        dummy_node_vector_0,
1070        dummy_node_vector_1,
1071        dummy_node_vector_2,
1072        dummy_node_vector_3,
1073    ))(s)?;
1074    Ok((s, node))
1075}
1076
1077fn access_node_vector_xxx(s: &str) -> IResult<&str, AccessNode> {
1078    value(AccessNode::AccessNodeVectorXXX, tag("VECTOR_XXX"))(s)
1079}
1080
1081fn access_node_name(s: &str) -> IResult<&str, AccessNode> {
1082    map(c_ident, AccessNode::AccessNodeName)(s)
1083}
1084
1085fn access_node(s: &str) -> IResult<&str, AccessNode> {
1086    alt((access_node_vector_xxx, access_node_name))(s)
1087}
1088
1089/// Environment Variable Definitions
1090fn environment_variable(s: &str) -> IResult<&str, EnvironmentVariable> {
1091    let (s, _) = multispace0(s)?;
1092    let (s, _) = tag("EV_")(s)?;
1093    let (s, _) = ms1(s)?;
1094    let (s, env_var_name) = c_ident(s)?;
1095    let (s, _) = colon(s)?;
1096    let (s, _) = ms1(s)?;
1097    let (s, env_var_type) = env_var_type(s)?;
1098    let (s, _) = ms1(s)?;
1099    let (s, _) = brk_open(s)?;
1100    let (s, min) = complete::i64(s)?;
1101    let (s, _) = pipe(s)?;
1102    let (s, max) = complete::i64(s)?;
1103    let (s, _) = brk_close(s)?;
1104    let (s, _) = ms1(s)?;
1105    let (s, unit) = char_string(s)?;
1106    let (s, _) = ms1(s)?;
1107    let (s, initial_value) = double(s)?;
1108    let (s, _) = ms1(s)?;
1109    let (s, ev_id) = complete::i64(s)?;
1110    let (s, _) = ms1(s)?;
1111    let (s, access_type) = access_type(s)?;
1112    let (s, _) = ms1(s)?;
1113    let (s, access_nodes) = separated_list0(comma, access_node)(s)?;
1114    let (s, _) = semi_colon(s)?;
1115    let (s, _) = line_ending(s)?;
1116    Ok((
1117        s,
1118        EnvironmentVariable {
1119            env_var_name,
1120            env_var_type,
1121            min,
1122            max,
1123            unit: unit.to_string(),
1124            initial_value,
1125            ev_id,
1126            access_type,
1127            access_nodes,
1128        },
1129    ))
1130}
1131
1132fn environment_variable_data(s: &str) -> IResult<&str, EnvironmentVariableData> {
1133    let (s, _) = multispace0(s)?;
1134    let (s, _) = tag("ENVVAR_DATA_")(s)?;
1135    let (s, _) = ms1(s)?;
1136    let (s, env_var_name) = c_ident(s)?;
1137    let (s, _) = colon(s)?;
1138    let (s, _) = ms1(s)?;
1139    let (s, data_size) = complete::u64(s)?;
1140    let (s, _) = semi_colon(s)?;
1141    let (s, _) = line_ending(s)?;
1142    Ok((
1143        s,
1144        EnvironmentVariableData {
1145            env_var_name,
1146            data_size,
1147        },
1148    ))
1149}
1150
1151fn signal_type(s: &str) -> IResult<&str, SignalType> {
1152    let (s, _) = multispace0(s)?;
1153    let (s, _) = tag("SGTYPE_")(s)?;
1154    let (s, _) = ms1(s)?;
1155    let (s, signal_type_name) = c_ident(s)?;
1156    let (s, _) = colon(s)?;
1157    let (s, _) = ms1(s)?;
1158    let (s, signal_size) = complete::u64(s)?;
1159    let (s, _) = at(s)?;
1160    let (s, byte_order) = byte_order(s)?;
1161    let (s, value_type) = value_type(s)?;
1162    let (s, _) = ms1(s)?;
1163    let (s, _) = brc_open(s)?;
1164    let (s, factor) = double(s)?;
1165    let (s, _) = comma(s)?;
1166    let (s, offset) = double(s)?;
1167    let (s, _) = brc_close(s)?;
1168    let (s, _) = ms1(s)?;
1169    let (s, _) = brk_open(s)?;
1170    let (s, min) = double(s)?;
1171    let (s, _) = pipe(s)?;
1172    let (s, max) = double(s)?;
1173    let (s, _) = brk_close(s)?;
1174    let (s, _) = ms1(s)?;
1175    let (s, unit) = char_string(s)?;
1176    let (s, _) = ms1(s)?;
1177    let (s, default_value) = double(s)?;
1178    let (s, _) = ms1(s)?;
1179    let (s, value_table) = c_ident(s)?;
1180    let (s, _) = semi_colon(s)?;
1181    let (s, _) = line_ending(s)?;
1182    Ok((
1183        s,
1184        SignalType {
1185            signal_type_name,
1186            signal_size,
1187            byte_order,
1188            value_type,
1189            factor,
1190            offset,
1191            min,
1192            max,
1193            unit: unit.to_string(),
1194            default_value,
1195            value_table,
1196        },
1197    ))
1198}
1199
1200#[allow(dead_code)]
1201fn attribute_value_uint64(s: &str) -> IResult<&str, AttributeValue> {
1202    map(complete::u64, AttributeValue::AttributeValueU64)(s)
1203}
1204
1205#[allow(dead_code)]
1206fn attribute_value_int64(s: &str) -> IResult<&str, AttributeValue> {
1207    map(complete::i64, AttributeValue::AttributeValueI64)(s)
1208}
1209
1210fn attribute_value_f64(s: &str) -> IResult<&str, AttributeValue> {
1211    map(double, AttributeValue::AttributeValueF64)(s)
1212}
1213
1214fn attribute_value_charstr(s: &str) -> IResult<&str, AttributeValue> {
1215    map(char_string, |x| {
1216        AttributeValue::AttributeValueCharString(x.to_string())
1217    })(s)
1218}
1219
1220fn attribute_value(s: &str) -> IResult<&str, AttributeValue> {
1221    alt((
1222        // attribute_value_uint64,
1223        // attribute_value_int64,
1224        attribute_value_f64,
1225        attribute_value_charstr,
1226    ))(s)
1227}
1228
1229fn network_node_attribute_value(s: &str) -> IResult<&str, AttributeValuedForObjectType> {
1230    let (s, _) = tag("BU_")(s)?;
1231    let (s, _) = ms1(s)?;
1232    let (s, node_name) = c_ident(s)?;
1233    let (s, _) = ms1(s)?;
1234    let (s, value) = attribute_value(s)?;
1235    Ok((
1236        s,
1237        AttributeValuedForObjectType::NetworkNodeAttributeValue(node_name, value),
1238    ))
1239}
1240
1241fn message_definition_attribute_value(s: &str) -> IResult<&str, AttributeValuedForObjectType> {
1242    let (s, _) = tag("BO_")(s)?;
1243    let (s, _) = ms1(s)?;
1244    let (s, message_id) = message_id(s)?;
1245    let (s, _) = ms1(s)?;
1246    let (s, value) = opt(attribute_value)(s)?;
1247    Ok((
1248        s,
1249        AttributeValuedForObjectType::MessageDefinitionAttributeValue(message_id, value),
1250    ))
1251}
1252
1253fn signal_attribute_value(s: &str) -> IResult<&str, AttributeValuedForObjectType> {
1254    let (s, _) = tag("SG_")(s)?;
1255    let (s, _) = ms1(s)?;
1256    let (s, message_id) = message_id(s)?;
1257    let (s, _) = ms1(s)?;
1258    let (s, signal_name) = c_ident(s)?;
1259    let (s, _) = ms1(s)?;
1260    let (s, value) = attribute_value(s)?;
1261    Ok((
1262        s,
1263        AttributeValuedForObjectType::SignalAttributeValue(message_id, signal_name, value),
1264    ))
1265}
1266
1267fn env_variable_attribute_value(s: &str) -> IResult<&str, AttributeValuedForObjectType> {
1268    let (s, _) = tag("EV_")(s)?;
1269    let (s, _) = ms1(s)?;
1270    let (s, env_var_name) = c_ident(s)?;
1271    let (s, _) = ms1(s)?;
1272    let (s, value) = attribute_value(s)?;
1273    Ok((
1274        s,
1275        AttributeValuedForObjectType::EnvVariableAttributeValue(env_var_name, value),
1276    ))
1277}
1278
1279fn raw_attribute_value(s: &str) -> IResult<&str, AttributeValuedForObjectType> {
1280    map(
1281        attribute_value,
1282        AttributeValuedForObjectType::RawAttributeValue,
1283    )(s)
1284}
1285
1286fn attribute_value_for_object(s: &str) -> IResult<&str, AttributeValueForObject> {
1287    let (s, _) = multispace0(s)?;
1288    let (s, _) = tag("BA_")(s)?;
1289    let (s, _) = ms1(s)?;
1290    let (s, attribute_name) = char_string(s)?;
1291    let (s, _) = ms1(s)?;
1292    let (s, attribute_value) = alt((
1293        network_node_attribute_value,
1294        message_definition_attribute_value,
1295        signal_attribute_value,
1296        env_variable_attribute_value,
1297        raw_attribute_value,
1298    ))(s)?;
1299    let (s, _) = semi_colon(s)?;
1300    let (s, _) = line_ending(s)?;
1301    Ok((
1302        s,
1303        AttributeValueForObject {
1304            attribute_name: attribute_name.to_string(),
1305            attribute_value,
1306        },
1307    ))
1308}
1309
1310// TODO add properties
1311fn attribute_definition_node(s: &str) -> IResult<&str, AttributeDefinition> {
1312    let (s, _) = tag("BU_")(s)?;
1313    let (s, _) = ms1(s)?;
1314    let (s, node) = take_till(is_semi_colon)(s)?;
1315    Ok((s, AttributeDefinition::Node(node.to_string())))
1316}
1317
1318// TODO add properties
1319fn attribute_definition_signal(s: &str) -> IResult<&str, AttributeDefinition> {
1320    let (s, _) = tag("SG_")(s)?;
1321    let (s, _) = ms1(s)?;
1322    let (s, signal) = take_till(is_semi_colon)(s)?;
1323    Ok((s, AttributeDefinition::Signal(signal.to_string())))
1324}
1325
1326// TODO add properties
1327fn attribute_definition_environment_variable(s: &str) -> IResult<&str, AttributeDefinition> {
1328    let (s, _) = tag("EV_")(s)?;
1329    let (s, _) = ms1(s)?;
1330    let (s, env_var) = take_till(is_semi_colon)(s)?;
1331    Ok((
1332        s,
1333        AttributeDefinition::EnvironmentVariable(env_var.to_string()),
1334    ))
1335}
1336
1337// TODO add properties
1338fn attribute_definition_message(s: &str) -> IResult<&str, AttributeDefinition> {
1339    let (s, _) = tag("BO_")(s)?;
1340    let (s, _) = ms1(s)?;
1341    let (s, message) = take_till(is_semi_colon)(s)?;
1342    Ok((s, AttributeDefinition::Message(message.to_string())))
1343}
1344
1345// TODO add properties
1346fn attribute_definition_plain(s: &str) -> IResult<&str, AttributeDefinition> {
1347    let (s, plain) = take_till(is_semi_colon)(s)?;
1348    Ok((s, AttributeDefinition::Plain(plain.to_string())))
1349}
1350
1351fn attribute_definition(s: &str) -> IResult<&str, AttributeDefinition> {
1352    let (s, _) = multispace0(s)?;
1353    let (s, _) = tag("BA_DEF_")(s)?;
1354    let (s, _) = ms1(s)?;
1355    let (s, def) = alt((
1356        attribute_definition_node,
1357        attribute_definition_signal,
1358        attribute_definition_environment_variable,
1359        attribute_definition_message,
1360        attribute_definition_plain,
1361    ))(s)?;
1362
1363    let (s, _) = semi_colon(s)?;
1364    let (s, _) = line_ending(s)?;
1365    Ok((s, def))
1366}
1367
1368fn symbol(s: &str) -> IResult<&str, Symbol> {
1369    let (s, _) = space1(s)?;
1370    let (s, symbol) = c_ident(s)?;
1371    let (s, _) = line_ending(s)?;
1372    Ok((s, Symbol(symbol)))
1373}
1374
1375fn new_symbols(s: &str) -> IResult<&str, Vec<Symbol>> {
1376    let (s, _) = multispace0(s)?;
1377    let (s, _) = tag("NS_ :")(s)?;
1378    let (s, _) = space0(s)?;
1379    let (s, _) = line_ending(s)?;
1380    let (s, symbols) = many0(symbol)(s)?;
1381    Ok((s, symbols))
1382}
1383
1384/// Network node
1385fn node(s: &str) -> IResult<&str, Node> {
1386    let (s, _) = multispace0(s)?;
1387    let (s, _) = tag("BU_:")(s)?;
1388    let (s, li) = opt(preceded(ms1, separated_list0(ms1, c_ident)))(s)?;
1389    let (s, _) = space0(s)?;
1390    let (s, _) = line_ending(s)?;
1391    Ok((s, Node(li.unwrap_or_default())))
1392}
1393
1394fn signal_type_ref(s: &str) -> IResult<&str, SignalTypeRef> {
1395    let (s, _) = multispace0(s)?;
1396    let (s, _) = tag("SGTYPE_")(s)?;
1397    let (s, _) = ms1(s)?;
1398    let (s, message_id) = message_id(s)?;
1399    let (s, _) = ms1(s)?;
1400    let (s, signal_name) = c_ident(s)?;
1401    let (s, _) = ms1(s)?;
1402    let (s, _) = colon(s)?;
1403    let (s, _) = ms1(s)?;
1404    let (s, signal_type_name) = c_ident(s)?;
1405    let (s, _) = semi_colon(s)?;
1406    let (s, _) = line_ending(s)?;
1407    Ok((
1408        s,
1409        SignalTypeRef {
1410            message_id,
1411            signal_name,
1412            signal_type_name,
1413        },
1414    ))
1415}
1416
1417fn value_table(s: &str) -> IResult<&str, ValueTable> {
1418    let (s, _) = multispace0(s)?;
1419    let (s, _) = tag("VAL_TABLE_")(s)?;
1420    let (s, _) = ms1(s)?;
1421    let (s, value_table_name) = c_ident(s)?;
1422    let (s, value_descriptions) =
1423        many_till(preceded(ms0, value_description), preceded(ms0, semi_colon))(s)?;
1424    let (s, _) = line_ending(s)?;
1425    Ok((
1426        s,
1427        ValueTable {
1428            value_table_name,
1429            value_descriptions: value_descriptions.0,
1430        },
1431    ))
1432}
1433
1434fn extended_multiplex_mapping(s: &str) -> IResult<&str, ExtendedMultiplexMapping> {
1435    let (s, _) = ms0(s)?;
1436    let (s, min_value) = complete::u64(s)?;
1437    let (s, _) = char('-')(s)?;
1438    let (s, max_value) = complete::u64(s)?;
1439    Ok((
1440        s,
1441        ExtendedMultiplexMapping {
1442            min_value,
1443            max_value,
1444        },
1445    ))
1446}
1447
1448fn extended_multiplex(s: &str) -> IResult<&str, ExtendedMultiplex> {
1449    let (s, _) = multispace0(s)?;
1450    let (s, _) = tag("SG_MUL_VAL_")(s)?;
1451    let (s, _) = ms1(s)?;
1452    let (s, message_id) = message_id(s)?;
1453    let (s, _) = ms1(s)?;
1454    let (s, signal_name) = c_ident(s)?;
1455    let (s, _) = ms1(s)?;
1456    let (s, multiplexor_signal_name) = c_ident(s)?;
1457    let (s, _) = ms1(s)?;
1458    let (s, mappings) = separated_list0(tag(","), extended_multiplex_mapping)(s)?;
1459    let (s, _) = semi_colon(s)?;
1460    let (s, _) = line_ending(s)?;
1461    Ok((
1462        s,
1463        ExtendedMultiplex {
1464            message_id,
1465            signal_name,
1466            multiplexor_signal_name,
1467            mappings,
1468        },
1469    ))
1470}
1471
1472fn signed_or_unsigned_integer(s: &str) -> IResult<&str, SignalExtendedValueType> {
1473    value(SignalExtendedValueType::SignedOrUnsignedInteger, tag("0"))(s)
1474}
1475fn ieee_float_32bit(s: &str) -> IResult<&str, SignalExtendedValueType> {
1476    value(SignalExtendedValueType::IEEEfloat32Bit, tag("1"))(s)
1477}
1478fn ieee_double_64bit(s: &str) -> IResult<&str, SignalExtendedValueType> {
1479    value(SignalExtendedValueType::IEEEdouble64bit, tag("2"))(s)
1480}
1481
1482fn signal_extended_value_type(s: &str) -> IResult<&str, SignalExtendedValueType> {
1483    alt((
1484        signed_or_unsigned_integer,
1485        ieee_float_32bit,
1486        ieee_double_64bit,
1487    ))(s)
1488}
1489
1490fn signal_extended_value_type_list(s: &str) -> IResult<&str, SignalExtendedValueTypeList> {
1491    let (s, _) = multispace0(s)?;
1492    let (s, _) = tag("SIG_VALTYPE_")(s)?;
1493    let (s, _) = ms1(s)?;
1494    let (s, message_id) = message_id(s)?;
1495    let (s, _) = ms1(s)?;
1496    let (s, signal_name) = c_ident(s)?;
1497    let (s, _) = ms1(s)?;
1498    let (s, _) = opt(colon)(s)?;
1499    let (s, _) = ms1(s)?;
1500    let (s, signal_extended_value_type) = signal_extended_value_type(s)?;
1501    let (s, _) = semi_colon(s)?;
1502    let (s, _) = line_ending(s)?;
1503    Ok((
1504        s,
1505        SignalExtendedValueTypeList {
1506            message_id,
1507            signal_name,
1508            signal_extended_value_type,
1509        },
1510    ))
1511}
1512
1513fn transmitter_vector_xxx(s: &str) -> IResult<&str, Transmitter> {
1514    value(Transmitter::VectorXXX, tag("Vector__XXX"))(s)
1515}
1516
1517fn transmitter_node_name(s: &str) -> IResult<&str, Transmitter> {
1518    map(c_ident, Transmitter::NodeName)(s)
1519}
1520
1521fn transmitter(s: &str) -> IResult<&str, Transmitter> {
1522    alt((transmitter_vector_xxx, transmitter_node_name))(s)
1523}
1524
1525fn message_transmitters(s: &str) -> IResult<&str, Vec<Transmitter>> {
1526    separated_list0(comma, transmitter)(s)
1527}
1528
1529fn message_transmitter(s: &str) -> IResult<&str, MessageTransmitter> {
1530    let (s, _) = multispace0(s)?;
1531    let (s, _) = tag("BO_TX_BU_")(s)?;
1532    let (s, _) = ms1(s)?;
1533    let (s, message_id) = message_id(s)?;
1534    let (s, _) = ms1(s)?;
1535    let (s, _) = colon(s)?;
1536    let (s, _) = ms1(s)?;
1537    let (s, transmitter) = message_transmitters(s)?;
1538    let (s, _) = semi_colon(s)?;
1539    let (s, _) = line_ending(s)?;
1540    Ok((
1541        s,
1542        MessageTransmitter {
1543            message_id,
1544            transmitter,
1545        },
1546    ))
1547}
1548
1549fn signal_groups(s: &str) -> IResult<&str, SignalGroups> {
1550    let (s, _) = multispace0(s)?;
1551    let (s, _) = tag("SIG_GROUP_")(s)?;
1552    let (s, _) = ms1(s)?;
1553    let (s, message_id) = message_id(s)?;
1554    let (s, _) = ms1(s)?;
1555    let (s, signal_group_name) = c_ident(s)?;
1556    let (s, _) = ms1(s)?;
1557    let (s, repetitions) = complete::u64(s)?;
1558    let (s, _) = ms1(s)?;
1559    let (s, _) = colon(s)?;
1560    let (s, _) = ms1(s)?;
1561    let (s, signal_names) = separated_list0(ms1, c_ident)(s)?;
1562    let (s, _) = semi_colon(s)?;
1563    let (s, _) = line_ending(s)?;
1564    Ok((
1565        s,
1566        SignalGroups {
1567            message_id,
1568            signal_group_name,
1569            repetitions,
1570            signal_names,
1571        },
1572    ))
1573}
1574
1575pub fn dbc(s: &str) -> IResult<&str, DBC> {
1576    let (
1577        s,
1578        (
1579            version,
1580            new_symbols,
1581            bit_timing,
1582            nodes,
1583            value_tables,
1584            messages,
1585            message_transmitters,
1586            environment_variables,
1587            environment_variable_data,
1588            signal_types,
1589            comments,
1590            attribute_definitions,
1591            attribute_defaults,
1592            attribute_values,
1593            value_descriptions,
1594            signal_type_refs,
1595            signal_groups,
1596            signal_extended_value_type_list,
1597            extended_multiplex,
1598        ),
1599    ) = permutation((
1600        version,
1601        new_symbols,
1602        opt(bit_timing),
1603        many0(node),
1604        many0(value_table),
1605        many0(message),
1606        many0(message_transmitter),
1607        many0(environment_variable),
1608        many0(environment_variable_data),
1609        many0(signal_type),
1610        many0(comment),
1611        many0(attribute_definition),
1612        many0(attribute_default),
1613        many0(attribute_value_for_object),
1614        many0(value_descriptions),
1615        many0(signal_type_ref),
1616        many0(signal_groups),
1617        many0(signal_extended_value_type_list),
1618        many0(extended_multiplex),
1619    ))(s)?;
1620    let (s, _) = multispace0(s)?;
1621    Ok((
1622        s,
1623        DBC {
1624            version,
1625            new_symbols,
1626            bit_timing,
1627            nodes,
1628            value_tables,
1629            messages,
1630            message_transmitters,
1631            environment_variables,
1632            environment_variable_data,
1633            signal_types,
1634            comments,
1635            attribute_definitions,
1636            attribute_defaults,
1637            attribute_values,
1638            value_descriptions,
1639            signal_type_refs,
1640            signal_groups,
1641            signal_extended_value_type_list,
1642            extended_multiplex,
1643        },
1644    ))
1645}