Writer

Writer viene utilizzato per scrivere contenuti all'interno di Response:

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

In confronto a 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);
}

Le principali differenze tra i due sono:

  • Scopo diverso: Writer rappresenta la scrittura di contenuti specifici in Response, implementato da contenuti concreti come stringhe, messaggi di errore, ecc. Al contrario, Handler viene utilizzato per elaborare l'intera richiesta.
  • Writer viene creato all'interno di un Handler e si consuma quando viene chiamata la funzione write, rendendolo una chiamata unica. D'altra parte, Handler è condiviso tra tutte le richieste.
  • Writer può essere restituito come contenuto nel Result di un Handler.
  • Writer non include un parametro FlowCtrl, quindi non può controllare il flusso di esecuzione dell'intera richiesta.

Scribe implementa Writer ma offre meno funzionalità rispetto a Writer:

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

La funzione di rendering di Scribe scrive solo dati in Response e non può recuperare informazioni da Request o Depot durante questo processo.