Features
- A (comparatively) low-level AST for GraphQL grammar,
and high-level representation of
Schema
andExecutableDocument
. - All three can be parsed (using
apollo-parser
internally), created or modified programatically, and serialized. - Validation of schemas and executable documents, as defined in the GraphQL specification.
Getting started
Add the dependency to start using apollo-compiler
:
Or add this to your Cargo.toml
for a manual installation:
# Just an example, change to the necessary package version.
# Using an exact dependency is recommended for beta versions
[]
= "=1.0.0-beta.18"
Rust versions
apollo-compiler
is tested on the latest stable version of Rust.
Older version may or may not be compatible.
Usage
You can get started with apollo-compiler
:
use Schema;
let input = r#"
interface Pet {
name: String
}
type Dog implements Pet {
name: String
nickname: String
barkVolume: Int
}
type Cat implements Pet {
name: String
nickname: String
meowVolume: Int
}
union CatOrDog = Cat | Dog
type Human {
name: String
pets: [Pet]
}
type Query {
human: Human
}
"#;
/// In case of validation errors, the panic message will be nicely formatted
/// to point at relevant parts of the source file(s)
let schema = parse_and_validate.unwrap;
Examples
Accessing fragment definition field types
use ;
let schema_input = r#"
type User {
id: ID
name: String
profilePic(size: Int): URL
}
schema { query: User }
scalar URL @specifiedBy(url: "https://tools.ietf.org/html/rfc3986")
"#;
let query_input = r#"
query getUser {
... vipCustomer
}
#fragment definition where we want to know the field types.
fragment vipCustomer on User {
id
name
profilePic(size: 50)
}
"#;
let schema = parse_and_validate.unwrap;
let document = parse_and_validate
.unwrap;
let op = document.get_operation.expect;
let fragment_in_op = op.selection_set.selections.iter.filter_map.;
let fragment_fields = fragment_in_op.iter.flat_map.;
let field_ty = fragment_fields
.iter
.map
.;
assert_eq!;
Get a directive defined on a field used in a query operation definition.
use ;
let schema_input = r#"
type Query {
topProducts: Product
name: String
size: Int
}
type Product {
inStock: Boolean @join__field(graph: INVENTORY)
name: String @join__field(graph: PRODUCTS)
price: Int
shippingEstimate: Int
upc: String!
weight: Int
}
enum join__Graph {
INVENTORY,
PRODUCTS,
}
scalar join__FieldSet
directive @join__field(graph: join__Graph, requires: join__FieldSet, provides: join__FieldSet) on FIELD_DEFINITION
"#;
let query_input = r#"
query getProduct {
size
topProducts {
name
inStock
}
}
"#;
let schema = parse_and_validate.unwrap;
let document = parse_and_validate
.unwrap;
let get_product_op = document
.get_operation
.expect;
let in_stock_field = &get_product_op
.selection_set
.fields
.find
.expect
.selection_set
.fields
.find
.expect
.definition;
let in_stock_directive: = in_stock_field
.directives
.iter
.map
.collect;
assert_eq!;
Printing diagnostics for a faulty GraphQL document
let input = r#"
query {
cat {
name
}
}
query getPet {
cat {
owner {
name
}
}
}
query getPet {
cat {
treat
}
}
subscription sub {
newMessage {
body
sender
}
disallowedSecondRootField
}
type Query {
cat: Pet
}
type Subscription {
newMessage: Result
}
interface Pet {
name: String
}
type Dog implements Pet {
name: String
nickname: String
barkVolume: Int
}
type Cat implements Pet {
name: String
nickname: String
meowVolume: Int
}
union CatOrDog = Cat | Dog
"#;
if let Err = parse_mixed_validate
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.