Struct Request

Source
pub struct Request<'a> { /* private fields */ }
Expand description

container for dynamic type provided by Error’s default Service impl

Implementations§

Source§

impl Request<'_>

Source

pub fn request_ref<C>(&self) -> Option<&C>
where C: 'static,

request a reference of concrete type from dynamic container. Error would provide your application’s global state to it.

§Examples
use std::{convert::Infallible, fmt};

use xitca_web::{
    error::{Error, Request},
    handler::handler_service,
    http::WebResponse,
    service::Service,
    App, WebContext
};

let app = App::new()
    .at("/", handler_service(handler))
    .with_state(String::from("996")); // application has a root state of String type.

// handler function returns custom error type
async fn handler(_: &WebContext<'_, String>) -> Result<&'static str, MyError> {
    Err(MyError)
}

// a self defined error type and necessary error implements.
#[derive(Debug)]
struct MyError;

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str("my error")
    }
}

impl std::error::Error for MyError {}

impl From<MyError> for Error {
    fn from(e: MyError) -> Self {
        Self::from_service(e)
    }
}

// Assuming application state is needed in error handler then this is the Service impl
// you want to write
impl<'r> Service<WebContext<'r, Request<'r>>> for MyError {
    type Response = WebResponse;
    type Error = Infallible;

    async fn call(&self, ctx: WebContext<'r, Request<'r>>) -> Result<Self::Response, Self::Error> {
        // error::Request is able to provide application's state reference with runtime type casting.
        if let Some(state) = ctx.state().request_ref::<String>() {
            assert_eq!(state, "996");
        }
        todo!()
    }
}

Auto Trait Implementations§

§

impl<'a> Freeze for Request<'a>

§

impl<'a> !RefUnwindSafe for Request<'a>

§

impl<'a> !Send for Request<'a>

§

impl<'a> !Sync for Request<'a>

§

impl<'a> Unpin for Request<'a>

§

impl<'a> !UnwindSafe for Request<'a>

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

Source§

fn borrow(&self) -> &T

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> 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