Skip to main content

ApiJson

Struct ApiJson 

Source
pub struct ApiJson<T>(pub T);
Expand description

A drop-in replacement for axum::Json whose extraction failures reject with an ApiError JSON body instead of Axum’s default plain-text response.

As an extractor it deserializes the request body exactly like axum::Json, but on failure it short-circuits the handler with (StatusCode, Json<ApiError>):

  • malformed JSON -> 400 Bad Request, code INVALID_JSON
  • well-formed JSON of the wrong shape -> 422 Unprocessable Entity, code INVALID_BODY
  • missing or incorrect Content-Type -> 415 Unsupported Media Type, code UNSUPPORTED_MEDIA_TYPE

The HTTP status is taken from Axum’s own rejection, so it stays correct as Axum evolves. It also implements IntoResponse (serializing as 200 OK JSON), so it can be used as a handler return type just like axum::Json.

Unlike ValidatedJson, ApiJson performs no validation and so needs only the extract feature, not validator. Reach for ValidatedJson when you want validator-based field validation as well.

Requires the extract feature.

§Example

use axum_api_kit::ApiJson;
use serde::Deserialize;

#[derive(Deserialize)]
struct CreateUser {
    name: String,
}

// The body is deserialized before the handler runs; bad input becomes an ApiError body.
async fn create_user(ApiJson(user): ApiJson<CreateUser>) {
    let _ = user.name;
}

Tuple Fields§

§0: T

Trait Implementations§

Source§

impl<T: Clone> Clone for ApiJson<T>

Source§

fn clone(&self) -> ApiJson<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for ApiJson<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, S> FromRequest<S> for ApiJson<T>
where T: DeserializeOwned, S: Send + Sync,

Source§

type Rejection = (StatusCode, Json<ApiError>)

If the extractor fails it’ll use this “rejection” type. A rejection is a kind of error that can be converted into a response.
Source§

async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection>

Perform the extraction.
Source§

impl<T: Serialize> IntoResponse for ApiJson<T>

Source§

fn into_response(self) -> Response

Create a response.

Auto Trait Implementations§

§

impl<T> Freeze for ApiJson<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for ApiJson<T>
where T: RefUnwindSafe,

§

impl<T> Send for ApiJson<T>
where T: Send,

§

impl<T> Sync for ApiJson<T>
where T: Sync,

§

impl<T> Unpin for ApiJson<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for ApiJson<T>
where T: UnsafeUnpin,

§

impl<T> UnwindSafe for ApiJson<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T, S> Handler<IntoResponseHandler, S> for T
where T: IntoResponse + Clone + Send + Sync + 'static,

Source§

type Future = Ready<Response<Body>>

The type of future calling this handler returns.
Source§

fn call( self, _req: Request<Body>, _state: S, ) -> <T as Handler<IntoResponseHandler, S>>::Future

Call the handler with the given request.
Source§

fn layer<L>(self, layer: L) -> Layered<L, Self, T, S>
where L: Layer<HandlerService<Self, T, S>> + Clone, <L as Layer<HandlerService<Self, T, S>>>::Service: Service<Request<Body>>,

Apply a tower::Layer to the handler. Read more
Source§

fn with_state(self, state: S) -> HandlerService<Self, T, S>

Convert the handler into a Service by providing the state
Source§

impl<H, T> HandlerWithoutStateExt<T> for H
where H: Handler<T, ()>,

Source§

fn into_service(self) -> HandlerService<H, T, ()>

Convert the handler into a Service and no state.
Source§

fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>

Convert the handler into a MakeService and no state. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more