11use can_dbc_pest:: { Pair , Rule } ;
22
33use crate :: ast:: MessageId ;
4- use crate :: parser:: { parse_str , parse_uint, single_rule , DbcResult } ;
4+ use crate :: parser:: { inner_str , parse_uint, single_inner , DbcError } ;
55
66/// Object comments
77#[ derive( Clone , Debug , PartialEq ) ]
@@ -29,9 +29,11 @@ pub enum Comment {
2929 } ,
3030}
3131
32- impl Comment {
32+ impl TryFrom < Pair < ' _ , Rule > > for Comment {
33+ type Error = DbcError ;
34+
3335 /// Parse comment: `CM_ [BU_|BO_|SG_|EV_] object_name "comment_text";`
34- pub ( crate ) fn parse ( pair : Pair < Rule > ) -> DbcResult < Option < Self > > {
36+ fn try_from ( pair : Pair < ' _ , Rule > ) -> Result < Self , Self :: Error > {
3537 let mut comment = String :: new ( ) ;
3638 let mut message_id = None ;
3739 let mut signal_name = None ;
@@ -40,16 +42,19 @@ impl Comment {
4042
4143 for pairs in pair. into_inner ( ) {
4244 match pairs. as_rule ( ) {
43- Rule :: quoted_str => comment = parse_str ( pairs) ,
45+ Rule :: quoted_str => comment = inner_str ( pairs) ,
4446 Rule :: msg_var => {
45- message_id = Some ( parse_uint ( single_rule ( pairs, Rule :: message_id) ?) ? as u32 ) ;
47+ message_id = Some ( parse_uint ( single_inner ( pairs, Rule :: message_id) ?) ? as u32 ) ;
4648 }
4749 Rule :: node_var => {
48- node_name = Some ( single_rule ( pairs, Rule :: node_name) ?. as_str ( ) . to_string ( ) ) ;
50+ node_name = Some ( single_inner ( pairs, Rule :: node_name) ?. as_str ( ) . to_string ( ) ) ;
4951 }
5052 Rule :: env_var => {
51- env_var_name =
52- Some ( single_rule ( pairs, Rule :: env_var_name) ?. as_str ( ) . to_string ( ) ) ;
53+ env_var_name = Some (
54+ single_inner ( pairs, Rule :: env_var_name) ?
55+ . as_str ( )
56+ . to_string ( ) ,
57+ ) ;
5358 }
5459 Rule :: signal_var => {
5560 for sub_pair in pairs. into_inner ( ) {
@@ -85,16 +90,16 @@ impl Comment {
8590 } ) ;
8691
8792 Ok ( match ( message_id, signal_name, node_name, env_var_name) {
88- ( Some ( message_id) , Some ( name) , _, _) => Some ( Self :: Signal {
93+ ( Some ( message_id) , Some ( name) , _, _) => Self :: Signal {
8994 message_id,
9095 name,
9196 comment,
92- } ) ,
93- ( Some ( id) , None , _, _) => Some ( Self :: Message { id, comment } ) ,
94- ( _, _, Some ( name) , _) => Some ( Self :: Node { name, comment } ) ,
95- ( _, _, _, Some ( name) ) => Some ( Self :: EnvVar { name, comment } ) ,
96- _ if !comment. is_empty ( ) => Some ( Self :: Plain { comment } ) ,
97- _ => None ,
97+ } ,
98+ ( Some ( id) , None , _, _) => Self :: Message { id, comment } ,
99+ ( _, _, Some ( name) , _) => Self :: Node { name, comment } ,
100+ ( _, _, _, Some ( name) ) => Self :: EnvVar { name, comment } ,
101+ _ if !comment. is_empty ( ) => Self :: Plain { comment } ,
102+ _ => return Err ( DbcError :: ParseError ) ,
98103 } )
99104 }
100105}
0 commit comments