Depósito (Depot)

Un depósito es usado para almacenar datos cuando se procesa la solicitud (request). Es muy útil para compartir datos entre los middlewares.

La instancia del depósito es creada cuando el servidor recibe la solicitud del cliente y será eliminada cuando la solicitud (request) hay sido procesada.

Por ejemplo, queremos establecer current_user en set_user, y entonces usar éste valor en los siguientes middlewares para manipular.

use salvo::prelude::*;

#[handler]
async fn set_user(depot: &mut Depot) {
    depot.insert("current_user", "Elon Musk");
}
#[handler]
async fn hello(depot: &mut Depot) -> String {
    // Notice: Don't use String here, because you inserted a &str.
    let user = depot.get::<&str>("current_user").copied().unwrap();
    format!("Hey {}, I love your money and girls!", user)
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::new().hoop(set_user).goal(hello);

    let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}
[package]
name = "example-use-depot"
version = "0.1.0"
edition = "2021"
publish = false

[dependencies]
salvo.workspace = true
tokio = { version = "1", features = ["macros"] }
tracing = "0.1"
tracing-subscriber = "0.3"

Establecer y recuperar datos vía insert y get

Como se muestra arriba, key y value pueden ser insertadas dentro de Depot vía insert. Para valores de éste tipo, get puede ser usado para recuperarlo directamente.

depot.insert("a", "b");
assert_eq!(depot.get::<&str>("a").copied().unwrap(), "b")

Returns None if the key does not exist, or if the key exists, but the types do not match.

Establecer y recuperar datos vía inject y obtain

A veces, hay casos donde no necesariamente requieres especificar key, y también hay una única instancia del tipo. Para ésto puedes usar inject para inyectar los datos, y obtain para recuperar los datos. Ellos permiten insertar y recuperar datos sin utilizar key.

depot.inject(Config::new());
depot.obtain::<Config>();