Skip to main content

Crate necrassrs_axum

Crate necrassrs_axum 

Source
Expand description

Axum extraction and response conversion for GraphQL handlers.

Applications own routing, shared schema/dispatcher state, and per-request Context construction. GraphQLRequest extracts a runtime request; GraphQLResponse converts the result of necrassrs::execute to HTTP.

§Handler integration

use axum::{Router, extract::State, routing::post};
use necrassrs::{Dispatcher, Schema, Valid};
use necrassrs_axum::{GraphQLRequest, GraphQLResponse, negotiate_response};
use std::sync::Arc;

struct App<D> { schema: Valid<Schema>, dispatcher: D }

async fn graphql<D: Dispatcher<()> + Send + Sync + 'static>(
    State(state): State<Arc<App<D>>>,
    GraphQLRequest(request): GraphQLRequest,
) -> GraphQLResponse {
    let context = (); // Replace with application-owned request Context.
    GraphQLResponse(necrassrs::execute(
        &state.schema, &request, &state.dispatcher, &context,
    ).await)
}

fn app<D: Dispatcher<()> + Send + Sync + 'static>(state: Arc<App<D>>) -> Router {
    Router::new().route("/graphql", post(graphql::<D>).route_layer(axum::middleware::from_fn(negotiate_response))).with_state(state)
}

§HTTP behavior

Mount application-owned handlers with post. Request bodies are JSON with query, optional variables, and optional operationName. Axum accepts application/json and JSON suffix media types. Its default 2 MiB body limit applies; an application can set a different DefaultBodyLimit.

Malformed JSON receives 400, invalid JSON fields receive 422, unsupported content types receive 415, and oversized bodies receive 413. Route methods other than POST receive Axum’s 405. GraphQL syntax errors receive 400; other GraphQL request errors receive 422. Execution results, including domain errors, receive 200. Mount negotiate_response on GraphQL routes to negotiate responses using Accept. Extractor failures retain Axum’s rejection response and are not relabeled as GraphQL responses.

Structs§

GraphQLRequest
A GraphQL request parsed from an Axum JSON request body.
GraphQLResponse
Converts a completed runtime response to an HTTP response.

Functions§

graphiql_html
A GraphiQL page configured to send requests to an application-owned endpoint.
negotiate_response
Negotiates the response media type for an application-owned GraphQL route.