Expand description
§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:
cargo add reed-parserOr add this to your Cargo.toml for a manual installation:
# Just an example, change to the necessary package version.
[dependencies]
reed-parser = "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 reed_parser::Parser;
let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = Parser::new(input);
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 reed_parser::Parser;
let input = "union SearchResult = Photo | Person | Cat | Dog";
let parser = Parser::new(input);
let cst = parser.parse();
// cst.errors() returns an iterator with the errors encountered during lexing and parsing
assert_eq!(0, cst.errors().len());
// 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 reed_parser::{cst, Parser};
let input = "
type ProductDimension {
size: String
weight: Float @tag(name: \"hi from inventory value type field\")
}
";
let parser = Parser::new(input);
let cst = parser.parse();
assert_eq!(0, cst.errors().len());
let doc = cst.document();
for def in doc.definitions() {
if let cst::Definition::ObjectTypeDefinition(object_type) = def {
assert_eq!(object_type.name().unwrap().text(), "ProductDimension");
for field_def in object_type.fields_definition().unwrap().field_definitions() {
println!("{}", field_def.name().unwrap().text()); // size weight
}
}
}§Get variables used in a query
use reed_parser::{cst, Parser};
let input = "
query GraphQuery($graph_id: ID!, $variant: String) {
service(id: $graph_id) {
schema(tag: $variant) {
document
}
}
}
";
let parser = Parser::new(input);
let cst = parser.parse();
assert_eq!(0, cst.errors().len());
let doc = cst.document();
for def in doc.definitions() {
if let cst::Definition::OperationDefinition(op_def) = def {
assert_eq!(op_def.name().unwrap().text(), "GraphQuery");
let variable_defs = op_def.variable_definitions();
let variables: Vec<String> = variable_defs
.iter()
.map(|v| v.variable_definitions())
.flatten()
.filter_map(|v| Some(v.variable()?.text().to_string()))
.collect();
assert_eq!(
variables.as_slice(),
["graph_id".to_string(), "variant".to_string()]
);
}
}§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 preserved in the historical
apollo-parser-0.8.6.patch.
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.
Modules§
- cst
- Typed Concrete Syntax Tree module to access nodes in the tree.
Macros§
Structs§
- Error
- Lexer
- Parses GraphQL source text into tokens.
- Limit
Tracker - A LimitTracker enforces a particular limit within the parser. It keeps track of utilization so that we can report how close to a limit we approached over the lifetime of the tracker.
- Parser
- Parse GraphQL schemas or queries into a typed CST.
- Syntax
Tree - Text
Range - A range in text, represented as a pair of
TextSize. - Token
- A token generated by the lexer.
Enums§
- Syntax
Kind - A token generated by the
Parser. - Token
Kind - Tokens generated by the lexer.
Type Aliases§
- Syntax
Element - A
SyntaxNodeor aSyntaxToken. - Syntax
Node - A node in the immutable tree. It has other nodes and tokens as children.
- Syntax
Token - A leaf node in the syntax tree.