cbf16c5a33
* Bootstrap * Upd * Bootstrap macro * Revert stuff * Correct PoC to compile * Bootstrap #[graphql_interface] expansion * Bootstrap #[graphql_interface] meta parsing * Bootstrap #[graphql_interface] very basic code generation [skip ci] * Upd trait code generation and fix keywords usage [skip ci] * Expand trait impls [skip ci] * Tune up objects [skip ci] * Finally! Complies at least... [skip ci] * Parse meta for fields and its arguments [skip ci] - also, refactor and bikeshed new macros code * Impl filling fields meta and bootstrap field resolution [skip ci] * Poking with fields resolution [skip ci] * Solve Rust's teen async HRTB problems [skip ci] * Start parsing trait methods [skip ci] * Finish parsing fields from trait methods [skip ci] * Autodetect trait asyncness and allow to specify it [skip ci] * Allow to autogenerate trait object alias via attribute * Support generics in trait definition and asyncify them correctly * Temporary disable explicit async * Cover arguments and custom names/descriptions in tests * Re-enable tests with explicit async and fix the codegen to satisfy it * Check implementers are registered in schema and vice versa * Check argument camelCases * Test argument defaults, and allow Into coercions for them * Re-enable markers * Re-enable markers and relax Sized requirement on IsInputType/IsOutputType marker traits * Revert 'juniper_actix' fmt * Fix missing marks for object * Fix subscriptions marks * Deduce result type correctly via traits * Final fixes * Fmt * Restore marks checking * Support custom ScalarValue * Cover deprecations with tests * Impl dowcasting via methods * Impl dowcasting via external functions * Support custom context, vol. 1 * Support custom context, vol. 2 * Cover fallible field with test * Impl explicit generic ScalarValue, vol.1 * Impl explicit generic ScalarValue, vol.2 * Allow passing executor into methods * Generating enum, vol.1 * Generating enum, vol.2 * Generating enum, vol.3 * Generating enum, vol.3 * Generating enum, vol.4 * Generating enum, vol.5 * Generating enum, vol.6 * Generating enum, vol.7 * Generating enum, vol.8 * Refactor juniper stuff * Fix juniper tests, vol.1 * Fix juniper tests, vol.2 * Polish 'juniper' crate changes, vol.1 * Polish 'juniper' crate changes, vol.2 * Remove redundant stuf * Polishing 'juniper_codegen', vol.1 * Polishing 'juniper_codegen', vol.2 * Polishing 'juniper_codegen', vol.3 * Polishing 'juniper_codegen', vol.4 * Polishing 'juniper_codegen', vol.5 * Polishing 'juniper_codegen', vol.6 * Polishing 'juniper_codegen', vol.7 * Polishing 'juniper_codegen', vol.8 * Polishing 'juniper_codegen', vol.9 * Fix other crates tests and make Clippy happier * Fix examples * Add codegen failure tests, vol. 1 * Add codegen failure tests, vol. 2 * Add codegen failure tests, vol.3 * Fix codegen failure tests accordingly to latest nightly Rust * Fix codegen when interface has no implementers * Fix warnings in book tests * Describing new interfaces in Book, vol.1 Co-authored-by: Christian Legnitto <LegNeato@users.noreply.github.com>
81 lines
2.1 KiB
Markdown
81 lines
2.1 KiB
Markdown
# Introspection
|
|
|
|
GraphQL defines a special built-in top-level field called `__schema`. Querying
|
|
for this field allows one to [introspect the schema](https://graphql.org/learn/introspection/)
|
|
at runtime to see what queries and mutations the GraphQL server supports.
|
|
|
|
Because introspection queries are just regular GraphQL queries, Juniper supports
|
|
them natively. For example, to get all the names of the types supported one
|
|
could execute the following query against Juniper:
|
|
|
|
```graphql
|
|
{
|
|
__schema {
|
|
types {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Schema introspection output as JSON
|
|
|
|
Many client libraries and tools in the GraphQL ecosystem require a complete
|
|
representation of the server schema. Often this representation is in JSON and
|
|
referred to as `schema.json`. A complete representation of the schema can be
|
|
produced by issuing a specially crafted introspection query.
|
|
|
|
Juniper provides a convenience function to introspect the entire schema. The
|
|
result can then be converted to JSON for use with tools and libraries such as
|
|
[graphql-client](https://github.com/graphql-rust/graphql-client):
|
|
|
|
```rust
|
|
# #![allow(unused_variables)]
|
|
# extern crate juniper;
|
|
# extern crate serde_json;
|
|
use juniper::{EmptyMutation, EmptySubscription, FieldResult, IntrospectionFormat};
|
|
|
|
// Define our schema.
|
|
|
|
#[derive(juniper::GraphQLObject)]
|
|
struct Example {
|
|
id: String,
|
|
}
|
|
|
|
struct Context;
|
|
impl juniper::Context for Context {}
|
|
|
|
struct Query;
|
|
|
|
#[juniper::graphql_object(
|
|
Context = Context,
|
|
)]
|
|
impl Query {
|
|
fn example(id: String) -> FieldResult<Example> {
|
|
unimplemented!()
|
|
}
|
|
}
|
|
|
|
type Schema = juniper::RootNode<
|
|
'static,
|
|
Query,
|
|
EmptyMutation<Context>,
|
|
EmptySubscription<Context>
|
|
>;
|
|
|
|
fn main() {
|
|
// Create a context object.
|
|
let ctx = Context{};
|
|
|
|
// Run the built-in introspection query.
|
|
let (res, _errors) = juniper::introspect(
|
|
&Schema::new(Query, EmptyMutation::new(), EmptySubscription::new()),
|
|
&ctx,
|
|
IntrospectionFormat::default(),
|
|
).unwrap();
|
|
|
|
// Convert introspection result to json.
|
|
let json_result = serde_json::to_string_pretty(&res);
|
|
assert!(json_result.is_ok());
|
|
}
|
|
```
|