ライター

WriterResponse にコンテンツを書き込むために使用されます:

#[async_trait]
pub trait Writer {
    async fn write(mut self, req: &mut Request, depot: &mut Depot, res: &mut Response);
}

Handler と比較すると:

#[async_trait]
pub trait Handler: Send + Sync + 'static {
    async fn handle(&self, req: &mut Request, depot: &mut Depot, res: &mut Response, ctrl: &mut FlowCtrl);
}

両者の主な違いは:

  • 用途が異なります。Writer は具体的なコンテンツ(文字列、エラーメッセージなど)を Response に書き込むことを表し、Handler はリクエスト全体を処理するために使用されます。
  • WriterHandler 内で作成され、write 関数が呼び出されると自身を消費するため、1回限りの呼び出しです。一方、Handler はすべてのリクエストで共有されます。
  • WriterHandler が返す Result の内容として使用できます。
  • Writer には FlowCtrl パラメータが存在せず、リクエストの実行フローを制御することはできません。

ScribeWriter を実装していますが、Writer よりも機能が制限されています:

pub trait Scribe {
    fn render(self, res: &mut Response);
}

Scribe のレンダリング関数は単にデータを Response に書き込むだけで、この処理中に RequestDepot から情報を取得することはできません。