Inject

Struct Inject 

Source
pub struct Inject<M: ModuleInterface + HasComponent<I> + ?Sized, I: Interface + ?Sized>(/* private fields */);
Expand description

Used to retrieve a reference to a component from a shaku Module. The module should be stored in Axum state, wrapped in an Arc (Arc<MyModule>). This Arc<MyModule> must implement FromRef<S> where S is the Axum state type.

Use this struct as an extractor.

§Example

use axum::{routing::get, Router};
use axum::extract::{Extension, FromRef};
use shaku::{module, Component, Interface};
use shaku_axum::Inject;
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::net::TcpListener;

trait HelloWorld: Interface {
    fn greet(&self) -> String;
}

#[derive(Component)]
#[shaku(interface = HelloWorld)]
struct HelloWorldImpl;

impl HelloWorld for HelloWorldImpl {
    fn greet(&self) -> String {
        "Hello, world!".to_owned()
    }
}

module! {
    HelloModule {
        components = [HelloWorldImpl],
        providers = []
    }
}

#[derive(Clone)]
struct AppState {
    module: Arc<HelloModule>,
}

impl FromRef<AppState> for Arc<HelloModule> {
    fn from_ref(app_state: &AppState) -> Arc<HelloModule> {
        app_state.module.clone()
    }
}

async fn hello(hello_world: Inject<HelloModule, dyn HelloWorld>) -> String {
    hello_world.greet()
}

#[tokio::main]
async fn main() {
    let module = Arc::new(HelloModule::builder().build());
    let state = AppState { module };

    let app = Router::new()
        .route("/", get(hello))
        .with_state(state);

    let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap();
    axum::serve(listener, app.into_make_service())
        .await
        .unwrap();
}

Trait Implementations§

Source§

impl<M: ModuleInterface + HasComponent<I> + ?Sized, I: Interface + ?Sized> Deref for Inject<M, I>

Source§

type Target = I

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<S, M, I> FromRequestParts<S> for Inject<M, I>
where S: Send + Sync, M: ModuleInterface + HasComponent<I> + ?Sized, I: Interface + ?Sized, Arc<M>: FromRef<S>,

Source§

type Rejection = (StatusCode, String)

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_parts( _req: &mut Parts, state: &S, ) -> Result<Self, Self::Rejection>

Perform the extraction.

Auto Trait Implementations§

§

impl<M, I> Freeze for Inject<M, I>
where M: ?Sized, I: ?Sized,

§

impl<M, I> RefUnwindSafe for Inject<M, I>

§

impl<M, I> Send for Inject<M, I>
where M: ?Sized, I: ?Sized,

§

impl<M, I> Sync for Inject<M, I>
where M: ?Sized, I: ?Sized,

§

impl<M, I> Unpin for Inject<M, I>
where M: Unpin + ?Sized, I: ?Sized,

§

impl<M, I> UnwindSafe for Inject<M, I>
where I: RefUnwindSafe + ?Sized, M: UnwindSafe + ?Sized,

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<S, T> FromRequest<S, ViaParts> for T
where S: Send + Sync, T: FromRequestParts<S>,

Source§

type Rejection = <T as FromRequestParts<S>>::Rejection

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§

fn from_request( req: Request<Body>, state: &S, ) -> impl Future<Output = Result<T, <T as FromRequest<S, ViaParts>>::Rejection>>

Perform the extraction.
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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
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
Source§

impl<T> Any for T
where T: Any,

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Interface for T
where T: Any + Send + Sync,

Source§

impl<T> ModuleInterface for T
where T: Any + Send + Sync,