11use crate :: response:: { IntoResponse , Response } ;
22use crate :: { Body , dep:: http:: StatusCode } ;
3+ use bytes:: buf:: Writer ;
34use bytes:: { BufMut , BytesMut } ;
45use csv;
56use headers:: ContentType ;
@@ -87,12 +88,11 @@ where
8788 T : IntoIterator < Item : Serialize > + std:: fmt:: Debug ,
8889{
8990 fn into_response ( self ) -> Response {
90- // Use a small initial capacity of 128 bytes like serde_json::to_vec
91- // https://docs.rs/serde_json/1.0.82/src/serde_json/ser.rs.html#2189
92- let mut buf = BytesMut :: with_capacity ( 128 ) . writer ( ) ;
93- {
94- let mut wtr = csv:: Writer :: from_writer ( & mut buf) ;
95- let res: Result < Vec < _ > , _ > = self . 0 . into_iter ( ) . map ( |rec| wtr. serialize ( rec) ) . collect ( ) ;
91+ // Extracted into separate fn so it's only compiled once for all T.
92+ fn make_respone (
93+ res : csv:: Result < Vec < ( ) > > ,
94+ mut wtr : csv:: Writer < Writer < BytesMut > > ,
95+ ) -> Response {
9696 if let Err ( err) = res {
9797 return (
9898 StatusCode :: INTERNAL_SERVER_ERROR ,
@@ -109,13 +109,34 @@ where
109109 )
110110 . into_response ( ) ;
111111 }
112+
113+ let bw = match wtr. into_inner ( ) {
114+ Ok ( bw) => bw,
115+ Err ( err) => {
116+ return (
117+ StatusCode :: INTERNAL_SERVER_ERROR ,
118+ Headers :: single ( ContentType :: text_utf8 ( ) ) ,
119+ err. to_string ( ) ,
120+ )
121+ . into_response ( ) ;
122+ }
123+ } ;
124+
125+ (
126+ [ ( CONTENT_TYPE , HeaderValue :: from_static ( "text/csv" ) ) ] ,
127+ bw. into_inner ( ) . freeze ( ) ,
128+ )
129+ . into_response ( )
112130 }
113131
114- (
115- [ ( CONTENT_TYPE , HeaderValue :: from_static ( "text/csv" ) ) ] ,
116- buf. into_inner ( ) . freeze ( ) ,
117- )
118- . into_response ( )
132+ // Use a small initial capacity of 128 bytes like serde_json::to_vec
133+ // https://docs.rs/serde_json/1.0.82/src/serde_json/ser.rs.html#2189
134+ let buf = BytesMut :: with_capacity ( 128 ) . writer ( ) ;
135+
136+ let mut wtr = csv:: Writer :: from_writer ( buf) ;
137+ let res: Result < Vec < _ > , _ > = self . 0 . into_iter ( ) . map ( |rec| wtr. serialize ( rec) ) . collect ( ) ;
138+
139+ make_respone ( res, wtr)
119140 }
120141}
121142
0 commit comments