Skip to main content

ProblemValidatedJson

Struct ProblemValidatedJson 

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

The problem-flavored sibling of ValidatedJson: deserializes a JSON request body, validates it with validator, and rejects with an RFC 9457 Problem body via ProblemRejection on failure.

Status codes and the stable code extension member match ValidatedJson’s rejections exactly:

  • 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
  • validation failure -> 422 Unprocessable Entity, code VALIDATION_ERROR

A validation failure carries the same field-level map the flat rejection exposes, under the "details" extension member:

{
  "title": "Unprocessable Entity",
  "status": 422,
  "detail": "validation failed",
  "code": "VALIDATION_ERROR",
  "details": { "fields": { "name": [{ "code": "length", "params": { "min": 2 } }] } }
}

As with ProblemJson, detail carries the flat rejection’s message, code becomes the "code" extension member, and the Content-Type is negotiated from the request’s Accept headers via ProblemFormat::negotiate.

Requires the problem and validator features.

§Example

use axum_api_kit::ProblemValidatedJson;
use serde::Deserialize;
use validator::Validate;

#[derive(Deserialize, Validate)]
struct CreateUser {
    #[validate(length(min = 1, max = 100))]
    name: String,
    #[validate(email)]
    email: String,
}

// The body is deserialized and validated before the handler body runs;
// failures become RFC 9457 problem details responses.
async fn create_user(ProblemValidatedJson(user): ProblemValidatedJson<CreateUser>) {
    let _ = (user.name, user.email);
}

Tuple Fields§

§0: T

Trait Implementations§

Source§

impl<T: Clone> Clone for ProblemValidatedJson<T>

Source§

fn clone(&self) -> ProblemValidatedJson<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 ProblemValidatedJson<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 ProblemValidatedJson<T>

Available on crate feature validator only.
Source§

type Rejection = ProblemRejection

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.

Auto Trait Implementations§

§

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

§

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

§

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

§

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

§

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

§

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

§

impl<T> UnwindSafe for ProblemValidatedJson<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> 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