Depot

Depot は、単一リクエストに関連する一時データを保存するために使用されます。ミドルウェアは、自身が処理した一時データを Depot に格納し、後続のプログラムで利用できるようにします。

サーバーがクライアントブラウザからのリクエストを受信すると、Depot のインスタンスが作成されます。このインスタンスは、すべてのミドルウェアと Handler がリクエストを処理した後に破棄されます。

例えば、ログインミドルウェアで current_user を設定し、後続のミドルウェアや Handler で現在のユーザー情報を読み取ることができます。

概要

Depot は、リクエスト処理プロセス中にデータを保存および共有するために使用されます。型安全なデータコンテナを実装しており、主に2つの使用パターンをサポートします:

  1. キー・バリューストアinsert/get メソッドを使用して、文字列キーに関連付けられた値を格納・取得します。
  2. 型ベース注入inject/obtain メソッドを使用して、型に基づいて値を格納・取得します。

例が示すように、Depot は特にミドルウェアとハンドラ間でデータを受け渡すのに適しています。ミドルウェアは Depot に値(ユーザー情報、認証状態など)を設定でき、後続のハンドラはこれらの値を取得できます。これにより、再計算やクエリの繰り返しが不要になります。Depot の設計は、リクエスト処理チェーン全体でのデータの一貫性とアクセス可能性を保証し、複雑な Web アプリケーションを構築するためのコアツールです。

main.rs
Cargo.toml
use salvo::prelude::*;

#[handler]
async fn set_user(depot: &mut Depot) {
    depot.insert("user", "client");
}
#[handler]
async fn hello(depot: &mut Depot) -> String {
    format!(
        "Hello {}",
        depot.get::<&str>("user").copied().unwrap_or_default()
    )
}

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

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

    let acceptor = TcpListener::new("0.0.0.0:8698").bind().await;
    Server::new(acceptor).serve(router).await;
}

insertget によるデータの設定と取得

上記のように、insert を使用して keyvalueDepot に挿入できます。このタイプの値は、get を使用して直接取得できます。

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

指定された key が存在しない場合、または key は存在するが型が一致しない場合は、None が返されます。

injectobtain によるデータの設定と取得

場合によっては、具体的な key に関係なく、その型に対して単一のインスタンスのみが存在するデータがあります。このような場合、inject を使用してデータを挿入し、obtain を使用してデータを取得できます。これらを使用する際に key を指定する必要はありません。

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

Depot 構造体メソッド概要

カテゴリメソッド説明
作成/容量new()空の Depot を作成
with_capacity(capacity)指定された容量の Depot を作成
capacity()容量を取得
inner()内部の HashMap への参照を取得
型注入/取得inject<V>(value)型に基づいて値を注入
obtain<T>()注入された値への参照を取得
obtain_mut<T>()注入された値への可変参照を取得
contains<T>()特定の型が含まれているか確認
scrape<T>()注入された値を削除して返却
キー・バリュー操作insert(key, value)キーと値のペアを挿入
get<V>(key)キーに対応する値への参照を取得
get_mut<V>(key)キーに対応する値への可変参照を取得
contains_key(key)特定のキーが含まれているか確認
remove<V>(key)キーを削除して値を返却
delete(key)キーと値のペアを削除