@@ -40,12 +40,15 @@ fn generate_struct_parser(attrs: TokenStream, mut object: ItemStruct) -> TokenSt
4040 let expression_names = fields. get_expression_names ( ) ;
4141 let derived_expressions = fields. get_derived_expressions ( ) ;
4242 let create_expr = fields. create_instance_expr ( None ) ;
43+ let where_clause = generate_where_clause ( ) ;
4344
4445 let tokens = quote ! {
4546 #object
4647
47- impl nom_parse_trait:: ParseFrom <& str > for #name {
48- fn parse( input: & str ) -> nom:: IResult <& str , Self > {
48+ impl <I > nom_parse_trait:: ParseFrom <I > for #name
49+ #where_clause
50+ {
51+ fn parse( input: I ) -> nom:: IResult <I , Self > {
4952 use nom:: * ;
5053
5154 let ( input, ( #( #expression_names) , * ) ) = #expression. parse( input) ?;
@@ -145,15 +148,18 @@ pub fn parse_match(attrs: TokenStream, object: TokenStream) -> TokenStream {
145148 Err ( e) => return e. to_compile_error ( ) . into ( ) ,
146149 } ;
147150 let name = object. ident . clone ( ) ;
151+ let where_clause = generate_where_clause ( ) ;
148152
149153 match parse_string_match ( & fields, literal) {
150154 Ok ( parts) => {
151155 let names: Vec < _ > = fields. fields . iter ( ) . map ( |field| field. get_name ( ) ) . collect ( ) ;
152156 let tokens = quote ! {
153157 #object
154158
155- impl nom_parse_trait:: ParseFrom <& str > for #name {
156- fn parse( input: & str ) -> nom:: IResult <& str , Self > {
159+ impl <I > nom_parse_trait:: ParseFrom <I > for #name
160+ #where_clause
161+ {
162+ fn parse( input: I ) -> nom:: IResult <I , Self > {
157163 use nom:: * ;
158164
159165 let mut input = input;
@@ -168,3 +174,18 @@ pub fn parse_match(attrs: TokenStream, object: TokenStream) -> TokenStream {
168174 Err ( e) => e. to_compile_error ( ) . into ( ) ,
169175 }
170176}
177+
178+ fn generate_where_clause ( ) -> proc_macro2:: TokenStream {
179+ quote ! {
180+ where
181+ I : Clone ,
182+ I : nom:: Slice <std:: ops:: RangeTo <usize >> + nom:: Slice <std:: ops:: RangeFrom <usize >> + nom:: Slice <std:: ops:: Range <usize >>,
183+ I : nom:: InputTake + nom:: InputLength + nom:: Offset + nom:: AsBytes ,
184+ I : nom:: InputIter ,
185+ <I as nom:: InputIter >:: Item : nom:: AsChar + Copy ,
186+ <I as nom:: InputIter >:: IterElem : Clone ,
187+ I : nom:: InputTakeAtPosition ,
188+ <I as nom:: InputTakeAtPosition >:: Item : nom:: AsChar + Copy ,
189+ I : for <' a> nom:: Compare <& ' a [ u8 ] >,
190+ }
191+ }
0 commit comments