@@ -39,6 +39,7 @@ pub struct HeaderContext {
3939}
4040
4141impl HeaderContext {
42+ #[ must_use]
4243 pub fn new (
4344 app_state : Arc < AppState > ,
4445 request_context : RequestContext ,
@@ -64,7 +65,7 @@ impl HeaderContext {
6465 Some ( "http_header" ) => self . add_http_header ( & data) . map ( PageContext :: Header ) ,
6566 Some ( "redirect" ) => self . redirect ( & data) . map ( PageContext :: Close ) ,
6667 Some ( "json" ) => self . json ( & data) ,
67- Some ( "csv" ) => self . csv ( & data) ,
68+ Some ( "csv" ) => self . csv ( & data) . await ,
6869 Some ( "cookie" ) => self . add_cookie ( & data) . map ( PageContext :: Header ) ,
6970 Some ( "authentication" ) => self . authentication ( data) . await ,
7071 _ => self . start_body ( data) . await ,
@@ -225,10 +226,10 @@ impl HeaderContext {
225226 }
226227 }
227228
228- fn csv ( mut self , data : & JsonValue ) -> anyhow:: Result < PageContext > {
229+ async fn csv ( mut self , _data : & JsonValue ) -> anyhow:: Result < PageContext > {
229230 self . response
230231 . insert_header ( ( header:: CONTENT_TYPE , "text/csv" ) ) ;
231- let csv_renderer = CsvBodyRenderer :: new ( self . writer ) ;
232+ let csv_renderer = CsvBodyRenderer :: new ( self . writer ) . await ? ;
232233 let renderer = AnyRenderBodyContext :: Csv ( csv_renderer) ;
233234 let http_response = self . response . take ( ) ;
234235 Ok ( PageContext :: Body {
@@ -367,7 +368,7 @@ impl AnyRenderBodyContext {
367368 match self {
368369 AnyRenderBodyContext :: Html ( HtmlRenderContext { writer, .. } )
369370 | AnyRenderBodyContext :: Json ( JsonBodyRenderer { writer, .. } ) => {
370- writer. async_flush ( ) . await ?
371+ writer. async_flush ( ) . await ?;
371372 }
372373 AnyRenderBodyContext :: Csv ( csv_renderer) => csv_renderer. flush ( ) . await ?,
373374 }
@@ -456,11 +457,12 @@ pub struct CsvBodyRenderer {
456457}
457458
458459impl CsvBodyRenderer {
459- pub fn new ( writer : ResponseWriter ) -> CsvBodyRenderer {
460- CsvBodyRenderer {
460+ pub async fn new ( mut writer : ResponseWriter ) -> anyhow:: Result < CsvBodyRenderer > {
461+ tokio:: io:: AsyncWriteExt :: flush ( & mut writer) . await ?;
462+ Ok ( CsvBodyRenderer {
461463 writer : csv_async:: AsyncWriter :: from_writer ( writer) ,
462464 is_first : true ,
463- }
465+ } )
464466 }
465467
466468 pub async fn handle_row ( & mut self , data : & JsonValue ) -> anyhow:: Result < ( ) > {
@@ -473,7 +475,7 @@ impl CsvBodyRenderer {
473475 }
474476
475477 if let Some ( obj) = data. as_object ( ) {
476- let values: Vec < _ > = obj. values ( ) . map ( |v| v . to_string ( ) ) . collect ( ) ;
478+ let values: Vec < _ > = obj. values ( ) . map ( std :: string :: ToString :: to_string) . collect ( ) ;
477479 self . writer . write_record ( & values) . await ?;
478480 }
479481
0 commit comments