ライター

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

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

ハンドラーとの比較:

#[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関数呼び出し時に自身を消費するため、一回限りの呼び出しです。一方、Handlerはすべてのリクエストで共有されます。
  • WriterHandlerが返すResult内のコンテンツとして使用できます。
  • WriterにはFlowCtrlパラメータが存在せず、リクエスト全体の実行フローを制御できません。

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

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

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