use async_graphql::{ObjectType, Schema, SubscriptionType}; use poem::{async_trait, Endpoint, FromRequest, Request, Result}; use crate::{GraphQLBatchRequest, GraphQLBatchResponse}; /// A GraphQL query endpoint. /// /// # Example /// /// ``` /// use async_graphql::{EmptyMutation, EmptySubscription, Object, Schema}; /// use async_graphql_poem::GraphQL; /// use poem::{post, Route}; /// /// struct Query; /// /// #[Object] /// impl Query { /// async fn value(&self) -> i32 { /// 100 /// } /// } /// /// type MySchema = Schema; /// /// let schema = Schema::new(Query, EmptyMutation, EmptySubscription); /// let app = Route::new().at("/", post(GraphQL::new(schema))); /// ``` pub struct GraphQL { schema: Schema, } impl GraphQL { /// Create a GraphQL query endpoint. pub fn new(schema: Schema) -> Self { Self { schema } } } #[async_trait] impl Endpoint for GraphQL where Query: ObjectType + 'static, Mutation: ObjectType + 'static, Subscription: SubscriptionType + 'static, { type Output = GraphQLBatchResponse; async fn call(&self, req: Request) -> Result { let (req, mut body) = req.split(); let req = GraphQLBatchRequest::from_request(&req, &mut body).await?; Ok(GraphQLBatchResponse(self.schema.execute_batch(req.0).await)) } }