async-graphql/examples/tide.rs

48 lines
1.5 KiB
Rust

mod starwars;
use async_graphql::http::{
graphiql_source, playground_source, GQLRequest, GQLResponse, IntoQueryBuilder,
};
use async_graphql::{EmptyMutation, EmptySubscription, Schema};
use futures::TryFutureExt;
use mime;
use tide::{self, Request, Response};
type StarWarsSchema = Schema<starwars::QueryRoot, EmptyMutation, EmptySubscription>;
async fn index(mut request: Request<StarWarsSchema>) -> Response {
let gql_request: GQLRequest = request.body_json().await.unwrap();
let schema = request.state();
let gql_response = gql_request
.into_query_builder(schema)
.and_then(|builder| builder.execute())
.await;
Response::new(200)
.body_json(&GQLResponse(gql_response))
.unwrap()
}
async fn gql_playground(_request: Request<StarWarsSchema>) -> Response {
Response::new(200)
.body_string(playground_source("/", None))
.set_mime(mime::TEXT_HTML_UTF_8)
}
async fn gql_graphiql(_request: Request<StarWarsSchema>) -> Response {
Response::new(200)
.body_string(graphiql_source("/"))
.set_mime(mime::TEXT_HTML_UTF_8)
}
#[async_std::main]
async fn main() -> std::io::Result<()> {
let mut app = tide::with_state(
Schema::build(starwars::QueryRoot, EmptyMutation, EmptySubscription)
.data(starwars::StarWars::new())
.finish(),
);
app.at("/").post(index);
app.at("/").get(gql_playground);
app.at("/graphiql").get(gql_graphiql);
app.listen("0.0.0.0:8000").await
}