11static ATTR_PAYABLE : & str = "payable" ;
2+ static ATTR_OUTPUT_NAME : & str = "output_name" ;
23static ATTR_PAYMENT : & str = "payment" ;
34static ATTR_VAR_ARGS : & str = "var_args" ;
45static ATTR_EVENT : & str = "event" ;
@@ -104,6 +105,37 @@ pub fn extract_doc(attrs: &[syn::Attribute]) -> Vec<String> {
104105 . collect ( )
105106}
106107
108+ fn attr_one_string_arg ( attr : & syn:: Attribute ) -> String {
109+ let result_str: String ;
110+ let mut iter = attr. clone ( ) . tokens . into_iter ( ) ;
111+ match iter. next ( ) {
112+ Some ( proc_macro2:: TokenTree :: Group ( group) ) => {
113+ if group. delimiter ( ) != proc_macro2:: Delimiter :: Parenthesis {
114+ panic ! ( "event paranthesis expected" ) ;
115+ }
116+ let mut iter2 = group. stream ( ) . into_iter ( ) ;
117+ match iter2. next ( ) {
118+ Some ( proc_macro2:: TokenTree :: Literal ( lit) ) => {
119+ let str_val = lit. to_string ( ) ;
120+ if !str_val. starts_with ( '\"' ) || !str_val. ends_with ( '\"' ) {
121+ panic ! ( "string literal expected as attribute argument" ) ;
122+ }
123+ let substr = & str_val[ 1 ..str_val. len ( ) - 1 ] ;
124+ result_str = substr. to_string ( ) ;
125+ } ,
126+ _ => panic ! ( "literal expected as event identifier" ) ,
127+ }
128+ } ,
129+ _ => panic ! ( "missing event identifier" ) ,
130+ }
131+
132+ if iter. next ( ) . is_some ( ) {
133+ panic ! ( "event too many tokens in event attribute" ) ;
134+ }
135+
136+ result_str
137+ }
138+
107139fn find_attr_one_string_arg ( m : & syn:: TraitItemMethod , attr_name : & str ) -> Option < String > {
108140 let event_attr = m. attrs . iter ( ) . find ( |attr| {
109141 if let Some ( first_seg) = attr. path . segments . first ( ) {
@@ -114,37 +146,22 @@ fn find_attr_one_string_arg(m: &syn::TraitItemMethod, attr_name: &str) -> Option
114146 } ) ;
115147 match event_attr {
116148 None => None ,
117- Some ( attr) => {
118- let result_str: String ;
119- let mut iter = attr. clone ( ) . tokens . into_iter ( ) ;
120- match iter. next ( ) {
121- Some ( proc_macro2:: TokenTree :: Group ( group) ) => {
122- if group. delimiter ( ) != proc_macro2:: Delimiter :: Parenthesis {
123- panic ! ( "event paranthesis expected" ) ;
124- }
125- let mut iter2 = group. stream ( ) . into_iter ( ) ;
126- match iter2. next ( ) {
127- Some ( proc_macro2:: TokenTree :: Literal ( lit) ) => {
128- let str_val = lit. to_string ( ) ;
129- if !str_val. starts_with ( '\"' ) || !str_val. ends_with ( '\"' ) {
130- panic ! ( "string literal expected as attribute argument" ) ;
131- }
132- let substr = & str_val[ 1 ..str_val. len ( ) - 1 ] ;
133- result_str = substr. to_string ( ) ;
134- } ,
135- _ => panic ! ( "literal expected as event identifier" ) ,
136- }
137- } ,
138- _ => panic ! ( "missing event identifier" ) ,
139- }
149+ Some ( attr) => Some ( attr_one_string_arg ( attr) ) ,
150+ }
151+ }
140152
141- if iter. next ( ) . is_some ( ) {
142- panic ! ( "event too many tokens in event attribute" ) ;
153+ pub fn find_output_names ( m : & syn:: TraitItemMethod ) -> Vec < String > {
154+ m. attrs
155+ . iter ( )
156+ . filter ( |attr| {
157+ if let Some ( first_seg) = attr. path . segments . first ( ) {
158+ first_seg. ident == ATTR_OUTPUT_NAME
159+ } else {
160+ false
143161 }
144-
145- Some ( result_str)
146- } ,
147- }
162+ } )
163+ . map ( attr_one_string_arg)
164+ . collect ( )
148165}
149166
150167pub struct EventAttribute {
0 commit comments