use async_graphql::{BatchRequest, Executor, Request, http::MultipartOptions};
use warp::{Filter, Rejection, Reply, reply::Response as WarpResponse};
use crate::{GraphQLBadRequest, GraphQLBatchResponse, graphql_batch_opts};
pub fn graphql<E>(
executor: E,
) -> impl Filter<Extract = ((E, async_graphql::Request),), Error = Rejection> + Clone
where
E: Executor,
{
graphql_opts(executor, Default::default())
}
pub fn graphql_opts<E>(
executor: E,
opts: MultipartOptions,
) -> impl Filter<Extract = ((E, Request),), Error = Rejection> + Clone
where
E: Executor,
{
graphql_batch_opts(executor, opts).and_then(|(schema, batch): (_, BatchRequest)| async move {
<Result<_, Rejection>>::Ok((
schema,
batch
.into_single()
.map_err(|e| warp::reject::custom(GraphQLBadRequest(e)))?,
))
})
}
#[derive(Debug)]
pub struct GraphQLResponse(pub async_graphql::Response);
impl From<async_graphql::Response> for GraphQLResponse {
fn from(resp: async_graphql::Response) -> Self {
GraphQLResponse(resp)
}
}
impl Reply for GraphQLResponse {
fn into_response(self) -> WarpResponse {
GraphQLBatchResponse(self.0.into()).into_response()
}
}