@@ -7,14 +7,13 @@ use std::str;
77use  can_dbc_pest:: { DbcParser ,  Pair ,  Pairs ,  Parser  as  _,  Rule } ; 
88
99use  crate :: { 
10-     AccessNode ,  AccessType ,  AttributeDefault ,  AttributeDefaultRel ,  AttributeDefinition , 
11-     AttributeDefinitionRel ,  AttributeDefinitionRelObjectType ,  AttributeRel ,  AttributeRelObjectType , 
12-     AttributeValue ,  AttributeValueForObject ,  AttributeValueType ,  AttributeValuedForObjectType , 
13-     Baudrate ,  ByteOrder ,  Comment ,  Dbc ,  DbcError ,  DbcResult ,  EnvType ,  EnvironmentVariable , 
14-     EnvironmentVariableData ,  ExtendedMultiplex ,  ExtendedMultiplexMapping ,  Message ,  MessageId , 
15-     MessageTransmitter ,  MultiplexIndicator ,  Node ,  Signal ,  SignalExtendedValueType , 
16-     SignalExtendedValueTypeList ,  SignalGroups ,  SignalType ,  SignalTypeRef ,  Symbol ,  Transmitter , 
17-     ValDescription ,  ValueDescription ,  ValueTable ,  ValueType ,  Version , 
10+     AccessNode ,  AccessType ,  AttributeDefault ,  AttributeDefinition ,  AttributeValue , 
11+     AttributeValueForObject ,  AttributeValuedForObjectType ,  Baudrate ,  ByteOrder ,  Comment ,  Dbc , 
12+     DbcError ,  DbcResult ,  EnvType ,  EnvironmentVariable ,  EnvironmentVariableData ,  ExtendedMultiplex , 
13+     ExtendedMultiplexMapping ,  Message ,  MessageId ,  MessageTransmitter ,  MultiplexIndicator ,  Node , 
14+     Signal ,  SignalExtendedValueType ,  SignalExtendedValueTypeList ,  SignalGroups ,  SignalType , 
15+     SignalTypeRef ,  Symbol ,  Transmitter ,  ValDescription ,  ValueDescription ,  ValueTable ,  ValueType , 
16+     Version , 
1817} ; 
1918
2019/// Helper function to extract string content from quoted_str rule 
@@ -442,218 +441,6 @@ pub(crate) fn parse_attribute_value(pair: Pair<Rule>) -> DbcResult<AttributeValu
442441    } 
443442} 
444443
445- /// Parse relative attribute definition: BA_DEF_REL_ object_type attribute_name attribute_type; 
446- pub ( crate )  fn  parse_attribute_definition_rel ( 
447-     pair :  Pair < Rule > , 
448- )  -> DbcResult < AttributeDefinitionRel >  { 
449-     let  mut  object_type = None ; 
450-     let  mut  attribute_name = String :: new ( ) ; 
451-     let  mut  attribute_type = None ; 
452- 
453-     for  pair2 in  pair. into_inner ( )  { 
454-         match  pair2. as_rule ( )  { 
455-             Rule :: attribute_name => { 
456-                 attribute_name = parse_str ( pair2) ; 
457-             } 
458-             Rule :: attribute_type_int => { 
459-                 let  ( min_val,  max_val)  = parse_min_max_int ( pair2) ?; 
460-                 attribute_type = Some ( AttributeValueType :: Int ( min_val,  max_val) ) ; 
461-             } 
462-             Rule :: attribute_type_hex => { 
463-                 let  ( min_val,  max_val)  = parse_min_max_int ( pair2) ?; 
464-                 attribute_type = Some ( AttributeValueType :: Hex ( min_val,  max_val) ) ; 
465-             } 
466-             Rule :: attribute_type_float => { 
467-                 let  ( min_val,  max_val)  = parse_min_max_float ( pair2) ?; 
468-                 attribute_type = Some ( AttributeValueType :: Float ( min_val,  max_val) ) ; 
469-             } 
470-             Rule :: attribute_type_string => { 
471-                 attribute_type = Some ( AttributeValueType :: String ) ; 
472-             } 
473-             Rule :: attribute_type_enum => { 
474-                 let  mut  enum_values = Vec :: new ( ) ; 
475-                 for  enum_pair in  pair2. into_inner ( )  { 
476-                     if  enum_pair. as_rule ( )  == Rule :: quoted_str { 
477-                         enum_values. push ( parse_str ( enum_pair) ) ; 
478-                     } 
479-                 } 
480-                 attribute_type = Some ( AttributeValueType :: Enum ( enum_values) ) ; 
481-             } 
482-             Rule :: rel_object_type => { 
483-                 let  text = pair2. as_str ( ) ; 
484-                 match  text { 
485-                     "BU_SG_REL_"  => object_type = Some ( AttributeDefinitionRelObjectType :: BuSgRel ) , 
486-                     "BU_BO_REL_"  => object_type = Some ( AttributeDefinitionRelObjectType :: BuBoRel ) , 
487-                     "BU_EV_REL_"  => object_type = Some ( AttributeDefinitionRelObjectType :: BuEvRel ) , 
488-                     _ => return  Err ( DbcError :: ParseError ) , 
489-                 } 
490-             } 
491-             _other => { 
492-                 // Ignore other rules 
493-             } 
494-         } 
495-     } 
496- 
497-     let  object_type = object_type. ok_or ( DbcError :: ParseError ) ?; 
498-     let  attribute_value_type = attribute_type. ok_or ( DbcError :: ParseError ) ?; 
499- 
500-     Ok ( AttributeDefinitionRel  { 
501-         object_type, 
502-         attribute_name, 
503-         attribute_value_type, 
504-     } ) 
505- } 
506- 
507- /// Parse relative attribute value: BA_REL_ attribute_name object_type object_name value; 
508- pub ( crate )  fn  parse_attribute_rel ( pair :  Pair < Rule > )  -> DbcResult < AttributeRel >  { 
509-     let  mut  _attribute_name = String :: new ( ) ; 
510-     let  mut  _object_type = None ; 
511-     let  mut  _node_name = String :: new ( ) ; 
512-     let  mut  _message_id = None ; 
513-     let  mut  _signal_name = None ; 
514-     let  mut  _value = None ; 
515- 
516-     let  mut  inner_pairs = pair. into_inner ( ) ; 
517- 
518-     // Parse the structure: attribute_name, rel_object_type, rel_object_data 
519-     // First should be attribute_name 
520-     _attribute_name = parse_str ( next_rule ( & mut  inner_pairs,  Rule :: attribute_name) ?) ; 
521- 
522-     // Second should be rel_object_type 
523-     let  rel_object_type_pair = next_rule ( & mut  inner_pairs,  Rule :: rel_object_type) ?; 
524-     let  text = rel_object_type_pair. as_str ( ) ; 
525-     match  text { 
526-         "BU_SG_REL_"  => _object_type = Some ( AttributeRelObjectType :: BuSgRel ) , 
527-         "BU_BO_REL_"  => _object_type = Some ( AttributeRelObjectType :: BuBoRel ) , 
528-         "BU_EV_REL_"  => _object_type = Some ( AttributeRelObjectType :: BuEvRel ) , 
529-         _ => return  Err ( DbcError :: ParseError ) , 
530-     } 
531- 
532-     // Third should be rel_object_data - parse based on object type 
533-     let  rel_object_data_pair = next_rule ( & mut  inner_pairs,  Rule :: rel_object_data) ?; 
534-     let  mut  data_pairs = rel_object_data_pair. into_inner ( ) ; 
535- 
536-     match  _object_type. as_ref ( ) . unwrap ( )  { 
537-         AttributeRelObjectType :: BuSgRel  => { 
538-             // Pattern: ident ~ "SG_" ~ int ~ ident ~ num_str_value 
539-             // node_name, "SG_", message_id, signal_name, value 
540-             _node_name = next_rule ( & mut  data_pairs,  Rule :: ident) ?
541-                 . as_str ( ) 
542-                 . to_string ( ) ; 
543- 
544-             let  sg_pair = next_rule ( & mut  data_pairs,  Rule :: signal_var) ?; 
545-             // signal_var contains: signal_literal ~ message_id ~ ident 
546-             // signal_literal is silent (_), so we get message_id and ident directly 
547-             let  mut  signal_var_pairs = sg_pair. into_inner ( ) ; 
548- 
549-             // Get message_id (signal_literal is silent) 
550-             let  msg_id = parse_uint ( next_rule ( & mut  signal_var_pairs,  Rule :: message_id) ?) ? as  u32 ; 
551-             _message_id = Some ( if  msg_id &  ( 1  << 31 )  != 0  { 
552-                 MessageId :: Extended ( msg_id &  0x1FFF_FFFF ) 
553-             }  else  { 
554-                 MessageId :: Standard ( msg_id as  u16 ) 
555-             } ) ; 
556- 
557-             // Get signal name 
558-             _signal_name = Some ( 
559-                 next_rule ( & mut  signal_var_pairs,  Rule :: ident) ?
560-                     . as_str ( ) 
561-                     . to_string ( ) , 
562-             ) ; 
563-         } 
564-         AttributeRelObjectType :: BuBoRel  => { 
565-             // Pattern: ident ~ message_id ~ num_str_value 
566-             // node_name, message_id, value 
567-             _node_name = next_rule ( & mut  data_pairs,  Rule :: ident) ?
568-                 . as_str ( ) 
569-                 . to_string ( ) ; 
570- 
571-             let  msg_id = parse_uint ( next_rule ( & mut  data_pairs,  Rule :: message_id) ?) ? as  u32 ; 
572-             _message_id = Some ( if  msg_id &  ( 1  << 31 )  != 0  { 
573-                 MessageId :: Extended ( msg_id &  0x1FFF_FFFF ) 
574-             }  else  { 
575-                 MessageId :: Standard ( msg_id as  u16 ) 
576-             } ) ; 
577-         } 
578-         AttributeRelObjectType :: BuEvRel  => { 
579-             // Pattern: ident ~ "EV_" ~ ident ~ num_str_value 
580-             // node_name, "EV_", env_var_name, value 
581-             _node_name = next_rule ( & mut  data_pairs,  Rule :: ident) ?
582-                 . as_str ( ) 
583-                 . to_string ( ) ; 
584- 
585-             // Skip env_literal (EV_) - it's silent 
586-             let  env_var_name = next_rule ( & mut  data_pairs,  Rule :: ident) ?
587-                 . as_str ( ) 
588-                 . to_string ( ) ; 
589-             _signal_name = Some ( env_var_name) ; 
590-         } 
591-     } 
592- 
593-     // The last item should be the value (num_str_value is silent, so we get quoted_str or number) 
594-     let  value_pair = data_pairs. next ( ) . ok_or ( DbcError :: ParseError ) ?; 
595-     _value = Some ( match  value_pair. as_rule ( )  { 
596-         Rule :: quoted_str => AttributeValue :: String ( parse_str ( value_pair) ) , 
597-         Rule :: number => { 
598-             let  value_str = value_pair. as_str ( ) ; 
599-             if  let  Ok ( int_val)  = value_str. parse :: < i64 > ( )  { 
600-                 AttributeValue :: I64 ( int_val) 
601-             }  else  if  let  Ok ( float_val)  = value_str. parse :: < f64 > ( )  { 
602-                 AttributeValue :: Double ( float_val) 
603-             }  else  { 
604-                 return  Err ( DbcError :: ParseError ) ; 
605-             } 
606-         } 
607-         _ => return  Err ( DbcError :: ParseError ) , 
608-     } ) ; 
609- 
610-     // Don't use expect_empty here as there might be comments or whitespace 
611- 
612-     let  object_type = _object_type. ok_or ( DbcError :: ParseError ) ?; 
613-     let  message_id = _message_id. ok_or ( DbcError :: ParseError ) ?; 
614-     let  value = _value. ok_or ( DbcError :: ParseError ) ?; 
615- 
616-     Ok ( AttributeRel  { 
617-         attribute_name :  _attribute_name, 
618-         object_type, 
619-         node_name :  _node_name, 
620-         message_id, 
621-         signal_name :  _signal_name, 
622-         value, 
623-     } ) 
624- } 
625- 
626- /// Parse relative attribute default: BA_DEF_DEF_REL_ attribute_name default_value; 
627- pub ( crate )  fn  parse_attribute_default_rel ( pair :  Pair < Rule > )  -> DbcResult < AttributeDefaultRel >  { 
628-     let  mut  inner_pairs = pair. into_inner ( ) ; 
629- 
630-     let  attribute_name = parse_str ( next_rule ( & mut  inner_pairs,  Rule :: attribute_name) ?) ; 
631- 
632-     // Parse the value - could be quoted_str or number (num_str_value is silent) 
633-     let  value_pair = inner_pairs. next ( ) . ok_or ( DbcError :: ParseError ) ?; 
634-     let  value = match  value_pair. as_rule ( )  { 
635-         Rule :: quoted_str => AttributeValue :: String ( parse_str ( value_pair) ) , 
636-         Rule :: number => { 
637-             let  value_str = value_pair. as_str ( ) ; 
638-             if  let  Ok ( int_val)  = value_str. parse :: < i64 > ( )  { 
639-                 AttributeValue :: I64 ( int_val) 
640-             }  else  if  let  Ok ( float_val)  = value_str. parse :: < f64 > ( )  { 
641-                 AttributeValue :: Double ( float_val) 
642-             }  else  { 
643-                 return  Err ( DbcError :: ParseError ) ; 
644-             } 
645-         } 
646-         _ => return  Err ( DbcError :: ParseError ) , 
647-     } ; 
648- 
649-     // Don't use expect_empty here as there might be comments or whitespace 
650- 
651-     Ok ( AttributeDefaultRel  { 
652-         attribute_name, 
653-         attribute_value :  value, 
654-     } ) 
655- } 
656- 
657444/// Parse value table: VAL_TABLE_ table_name value1 "description1" value2 "description2" ... ; 
658445pub ( crate )  fn  parse_value_table ( pair :  Pair < Rule > )  -> DbcResult < ValueTable >  { 
659446    let  mut  inner_pairs = pair. into_inner ( ) ; 
@@ -686,6 +473,7 @@ fn next_rule<'a>(iter: &'a mut Pairs<Rule>, expected_rule: Rule) -> DbcResult<Pa
686473    } 
687474} 
688475
476+ #[ allow( dead_code) ]  
689477fn  peek_rule < ' a > ( iter :  & mut  Pairs < ' a ,  Rule > ,  expected_rule :  Rule )  -> Option < Pair < ' a ,  Rule > >  { 
690478    if  let  Some ( pair)  = iter. peek ( )  { 
691479        if  pair. as_rule ( )  == expected_rule { 
@@ -696,6 +484,7 @@ fn peek_rule<'a>(iter: &mut Pairs<'a, Rule>, expected_rule: Rule) -> Option<Pair
696484} 
697485
698486/// Helper function to ensure the iterator is empty (no more items) 
487+ #[ allow( dead_code) ]  
699488fn  expect_empty < ' a > ( iter :  & mut  Pairs < Rule > )  -> DbcResult < ( ) >  { 
700489    if  iter. next ( ) . is_some ( )  { 
701490        Err ( DbcError :: ParseError ) 
@@ -1151,9 +940,6 @@ pub(crate) fn dbc(buffer: &str) -> DbcResult<Dbc> {
1151940    let  mut  attribute_definitions:  Vec < AttributeDefinition >  = Default :: default ( ) ; 
1152941    let  mut  attribute_defaults:  Vec < AttributeDefault >  = Default :: default ( ) ; 
1153942    let  mut  attribute_values:  Vec < AttributeValueForObject >  = Default :: default ( ) ; 
1154-     let  mut  attribute_definition_rels:  Vec < AttributeDefinitionRel >  = Default :: default ( ) ; 
1155-     let  mut  attribute_default_rels:  Vec < AttributeDefaultRel >  = Default :: default ( ) ; 
1156-     let  mut  attribute_rels:  Vec < AttributeRel >  = Default :: default ( ) ; 
1157943    let  mut  value_descriptions:  Vec < ValueDescription >  = Default :: default ( ) ; 
1158944    let  signal_type_refs:  Vec < SignalTypeRef >  = Default :: default ( ) ; 
1159945    let  mut  signal_groups:  Vec < SignalGroups >  = Default :: default ( ) ; 
@@ -1197,15 +983,6 @@ pub(crate) fn dbc(buffer: &str) -> DbcResult<Dbc> {
1197983                } 
1198984                Rule :: bo_tx_bu => message_transmitters. push ( parse_message_transmitter ( pair2) ?) , 
1199985                Rule :: ba_def_def => attribute_defaults. push ( parse_attribute_default ( pair2) ?) , 
1200-                 Rule :: ba_def_rel => { 
1201-                     attribute_definition_rels. push ( parse_attribute_definition_rel ( pair2) ?) ; 
1202-                 } 
1203-                 Rule :: ba_rel => { 
1204-                     attribute_rels. push ( parse_attribute_rel ( pair2) ?) ; 
1205-                 } 
1206-                 Rule :: ba_def_def_rel => { 
1207-                     attribute_default_rels. push ( parse_attribute_default_rel ( pair2) ?) ; 
1208-                 } 
1209986                Rule :: sg_mul_val => extended_multiplex. push ( parse_extended_multiplex ( pair2) ?) , 
1210987                Rule :: environment_variable => { 
1211988                    environment_variables. push ( parse_environment_variable ( pair2) ?) 
@@ -1241,9 +1018,6 @@ pub(crate) fn dbc(buffer: &str) -> DbcResult<Dbc> {
12411018        attribute_definitions, 
12421019        attribute_defaults, 
12431020        attribute_values, 
1244-         attribute_definition_rels, 
1245-         attribute_default_rels, 
1246-         attribute_rels, 
12471021        value_descriptions, 
12481022        signal_type_refs, 
12491023        signal_groups, 
0 commit comments