@@ -12,11 +12,44 @@ use tokio::sync::mpsc;
1212
1313#[ derive( Clone , Debug , PartialEq ) ]
1414pub ( crate ) struct Response {
15- pub status : StatusCode ,
15+ pub status : ResponseStatusCode ,
1616 pub headers : HeaderMap < Header > ,
1717 pub body : Body ,
1818}
1919
20+ #[ derive( Clone ) ]
21+ pub ( crate ) enum ResponseStatusCode {
22+ StatusCode ( StatusCode ) ,
23+ FnWithRequest ( Arc < StatusCodeFnWithRequest > ) ,
24+ }
25+
26+ impl fmt:: Debug for ResponseStatusCode {
27+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
28+ match * self {
29+ ResponseStatusCode :: StatusCode ( ref s) => s. fmt ( f) ,
30+ ResponseStatusCode :: FnWithRequest ( _) => f. write_str ( "<callback>" ) ,
31+ }
32+ }
33+ }
34+
35+ impl PartialEq for ResponseStatusCode {
36+ fn eq ( & self , other : & Self ) -> bool {
37+ match ( self , other) {
38+ ( ResponseStatusCode :: StatusCode ( ref a) , ResponseStatusCode :: StatusCode ( ref b) ) => {
39+ a == b
40+ }
41+ (
42+ ResponseStatusCode :: FnWithRequest ( ref a) ,
43+ ResponseStatusCode :: FnWithRequest ( ref b) ,
44+ ) => std:: ptr:: eq (
45+ a. as_ref ( ) as * const StatusCodeFnWithRequest as * const u8 ,
46+ b. as_ref ( ) as * const StatusCodeFnWithRequest as * const u8 ,
47+ ) ,
48+ _ => false ,
49+ }
50+ }
51+ }
52+
2053#[ derive( Clone ) ]
2154pub ( crate ) enum Header {
2255 String ( String ) ,
@@ -45,6 +78,7 @@ impl PartialEq for Header {
4578 }
4679}
4780
81+ type StatusCodeFnWithRequest = dyn Fn ( & Request ) -> usize + Send + Sync ;
4882type HeaderFnWithRequest = dyn Fn ( & Request ) -> String + Send + Sync ;
4983
5084type BodyFnWithWriter = dyn Fn ( & mut dyn io:: Write ) -> io:: Result < ( ) > + Send + Sync + ' static ;
@@ -89,7 +123,7 @@ impl Default for Response {
89123 let mut headers = HeaderMap :: with_capacity ( 1 ) ;
90124 headers. insert ( "connection" , Header :: String ( "close" . to_string ( ) ) ) ;
91125 Self {
92- status : StatusCode :: OK ,
126+ status : ResponseStatusCode :: StatusCode ( StatusCode :: OK ) ,
93127 headers,
94128 body : Body :: Bytes ( Bytes :: new ( ) ) ,
95129 }
0 commit comments