Skip to main content

JsonSocketBuilder

Struct JsonSocketBuilder 

Source
pub struct JsonSocketBuilder<T> { /* private fields */ }
Expand description

Route builder that expects and deserialises a JSON request body of type T.

Obtained from ServerMechanism::json. Optionally attach shared state via state, or finalise immediately with onconnect / onconnect_sync.

Implementations§

Source§

impl<T: DeserializeOwned + Send + 'static> JsonSocketBuilder<T>

Source

pub fn onconnect<F, Fut, Re>(self, handler: F) -> SocketType
where F: Fn(T) -> Fut + Clone + Send + Sync + 'static, Fut: Future<Output = Result<Re, Rejection>> + Send, Re: Reply + Send,

Finalises this route with an async handler that receives the deserialised JSON body.

Before the handler is called, the incoming request body is parsed as Content-Type: application/json and deserialised into T. The handler receives a ready-to-use T — no manual parsing is needed. If the body is absent or cannot be decoded the request is rejected before the handler is ever invoked.

The handler must return Result<impl Reply, Rejection>. Returns a SocketType ready to be passed to Server::mechanism.

Source

pub unsafe fn onconnect_sync<F, Re>(self, handler: F) -> SocketType
where F: Fn(T) -> Result<Re, Rejection> + Clone + Send + Sync + 'static, Re: Reply + Send + 'static,

Finalises this route with a synchronous handler that receives the deserialised JSON body.

The body is decoded into T before the handler is dispatched, identical to the async variant. The closure may block but must complete quickly to avoid exhausting the blocking thread pool.

Returns a SocketType ready to be passed to Server::mechanism.

§Safety

Every incoming request spawns an independent task on Tokio’s blocking thread pool. The pool caps the number of live OS threads (default 512), but the queue of waiting tasks is unbounded — under a traffic surge, tasks accumulate without limit, consuming unbounded memory and causing severe latency spikes or OOM crashes before any queued task gets a chance to run. Additionally, any panic inside the handler is silently converted into a Rejection, masking runtime errors. Callers must ensure the handler completes quickly and that adequate backpressure or rate limiting is applied externally.

Source

pub fn state<S: Clone + Send + Sync + 'static>( self, state: S, ) -> StatefulJsonSocketBuilder<T, S>

Attaches shared state S, transitioning to StatefulJsonSocketBuilder.

Alternative ordering to .state(s).json::<T>() — both produce the same route. A fresh clone of S is injected alongside the JSON-decoded T on every request. The handler will receive (state: S, body: T).

S must be Clone + Send + Sync + 'static.

Auto Trait Implementations§

§

impl<T> Freeze for JsonSocketBuilder<T>

§

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

§

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

§

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

§

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

§

impl<T> UnsafeUnpin for JsonSocketBuilder<T>

§

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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