@@ -206,11 +206,20 @@ pub fn parse_query<'a, S>(s: &'a str) -> Result<Document<'a, S>, ParseError>
206
206
Ok ( doc)
207
207
}
208
208
209
+ /// Parses a single ExecutableDefinition and returns an AST as well as the
210
+ /// remainder of the input which is unparsed
211
+ pub fn consume_definition < ' a , S > ( s : & ' a str ) -> Result < ( Definition < ' a , S > , & ' a str ) , ParseError > where S : Text < ' a > {
212
+ let tokens = TokenStream :: new ( s) ;
213
+ let ( doc, tokens) = parser ( definition) . parse ( tokens) ?;
214
+
215
+ Ok ( ( doc, & s[ tokens. offset ( ) ..] ) )
216
+ }
217
+
209
218
#[ cfg( test) ]
210
219
mod test {
211
220
use crate :: position:: Pos ;
212
221
use crate :: query:: grammar:: * ;
213
- use super :: parse_query;
222
+ use super :: { parse_query, consume_definition } ;
214
223
215
224
fn ast ( s : & str ) -> Document < String > {
216
225
parse_query :: < String > ( & s) . unwrap ( ) . to_owned ( )
@@ -292,6 +301,35 @@ mod test {
292
301
}
293
302
294
303
#[ test]
304
+ fn consume_single_query ( ) {
305
+ let ( query, remainder) = consume_definition :: < String > ( "query { a } query { b }" ) . unwrap ( ) ;
306
+ assert ! ( matches!( query, Definition :: Operation ( _) ) ) ;
307
+ assert_eq ! ( remainder, "query { b }" ) ;
308
+ }
309
+
310
+ #[ test]
311
+ fn consume_full_text ( ) {
312
+ let ( query, remainder) = consume_definition :: < String > ( "query { a }" ) . unwrap ( ) ;
313
+ assert ! ( matches!( query, Definition :: Operation ( _) ) ) ;
314
+ assert_eq ! ( remainder, "" ) ;
315
+ }
316
+
317
+ #[ test]
318
+ fn consume_single_query_preceding_non_graphql ( ) {
319
+ let ( query, remainder) =
320
+ consume_definition :: < String > ( "query { a } where a > 1 => 10.0" ) . unwrap ( ) ;
321
+ assert ! ( matches!( query, Definition :: Operation ( _) ) ) ;
322
+ assert_eq ! ( remainder, "where a > 1 => 10.0" ) ;
323
+ }
324
+
325
+ #[ test]
326
+ fn consume_fails_without_operation ( ) {
327
+ let err = consume_definition :: < String > ( "where a > 1 => 10.0" )
328
+ . expect_err ( "Expected parse to fail with an error" ) ;
329
+ let err = format ! ( "{}" , err) ;
330
+ assert_eq ! ( err, "query parse error: Parse error at 1:1\n Unexpected `where[Name]`\n Expected `{`, `query`, `mutation`, `subscription` or `fragment`\n " ) ;
331
+ }
332
+
295
333
fn recursion_too_deep ( ) {
296
334
let query = format ! ( "{}(b: {}{}){}" , "{ a" . repeat( 30 ) , "[" . repeat( 25 ) , "]" . repeat( 25 ) , "}" . repeat( 30 ) ) ;
297
335
let result = parse_query :: < & str > ( & query) ;
0 commit comments