Features
- Typed GraphQL concrete syntax tree
- Error resilience
- lexing and parsing does not fail or
panicif a lexical or a syntax error is found
- lexing and parsing does not fail or
- GraphQL lexer
- GraphQL parser
Getting started
Add the dependency to start using reed-parser:
Or add this to your Cargo.toml for a manual installation:
# Just an example, change to the necessary package version.
[]
= "0.1.0"
Rust versions
reed-parser is tested on the latest stable version of Rust.
Older version may or may not be compatible.
Usage
reed-parser parses GraphQL schemas and executable documents into a typed syntax
tree that can be walked to extract the required information. You can quick start
with:
use Parser;
let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = new;
let cst = parser.parse;
reed-parser is built to be error-resilient. This means we don't abort parsing (or lexing) if an error occurs. That means parser.parse() will always produce a CST (Concrete Syntax Tree), and it will be accompanied by any errors that are encountered:
use Parser;
let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = new;
let cst = parser.parse;
// cst.errors() returns an iterator with the errors encountered during lexing and parsing
assert_eq!;
// cst.document() gets the Document, or root node, of the tree that you can
// start iterating on.
let doc = cst.document;
Examples
Two examples outlined here:
The examples directory in this repository has a few more useful implementations such as:
- using apollo-rs with miette to display error diagnostics
- using apollo-rs with annotate_snippets to display error diagnostics
- checking for unused variables
Get field names in an object
use ;
let input = "
type ProductDimension {
size: String
weight: Float @tag(name: \"hi from inventory value type field\")
}
";
let parser = new;
let cst = parser.parse;
assert_eq!;
let doc = cst.document;
for def in doc.definitions
Get variables used in a query
use ;
let input = "
query GraphQuery($graph_id: ID!, $variant: String) {
service(id: $graph_id) {
schema(tag: $variant) {
document
}
}
}
";
let parser = new;
let cst = parser.parse;
assert_eq!;
let doc = cst.document;
for def in doc.definitions
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
Upstream provenance
Reed Parser 0.1.0 is derived from Apollo Parser 0.8.6 at upstream revision
e36ca6dceb668b4b0c703449beea39e75c16ead5.
The source corrections used to establish Reed are maintained in this crate and
its regression tests. Package naming, documentation paths, fixture discovery,
source item order needed by workspace lints, and regression tests are adapted
for the Reed package; the parser module organization is retained. The
restored upstream fixture corpus reclassifies operation descriptions and empty
selection sets and updates Unicode diagnostics to match the maintained September
2025 language corrections.