1use 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 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 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 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 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
608fn 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
620fn 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
635fn colon(s: &str) -> IResult<&str, char> {
637 char(':')(s)
638}
639
640fn comma(s: &str) -> IResult<&str, char> {
642 char(',')(s)
643}
644
645fn semi_colon(s: &str) -> IResult<&str, char> {
647 char(';')(s)
648}
649
650fn quote(s: &str) -> IResult<&str, char> {
652 char('"')(s)
653}
654
655fn pipe(s: &str) -> IResult<&str, char> {
657 char('|')(s)
658}
659
660fn at(s: &str) -> IResult<&str, char> {
662 char('@')(s)
663}
664
665fn brc_open(s: &str) -> IResult<&str, char> {
667 char('(')(s)
668}
669
670fn brc_close(s: &str) -> IResult<&str, char> {
672 char(')')(s)
673}
674
675fn brk_open(s: &str) -> IResult<&str, char> {
677 char('[')(s)
678}
679
680fn brk_close(s: &str) -> IResult<&str, char> {
682 char(']')(s)
683}
684
685fn 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
1089fn 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_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
1310fn 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
1318fn 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
1326fn 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
1337fn 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
1345fn 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
1384fn 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}