1
1
use runtime_demo:: choose_starter;
2
+ use serde:: { Deserialize , Serialize } ;
2
3
use serde_json:: json;
3
4
use vercel_runtime:: {
4
- process_request, process_response, run_service, service_fn, Body , Error , Request , Response ,
5
- ServiceBuilder , StatusCode ,
5
+ process_request, process_response, run_service, service_fn, Body , Error , Request , RequestExt ,
6
+ Response , ServiceBuilder , StatusCode ,
6
7
} ;
7
8
8
9
#[ tokio:: main]
@@ -22,19 +23,56 @@ async fn main() -> Result<(), Error> {
22
23
run_service ( handler) . await
23
24
}
24
25
25
- pub async fn handler ( _req : Request ) -> Result < Response < Body > , Error > {
26
- tracing:: info!( "Choosing a starter Pokemon" ) ;
27
- let starter = choose_starter ( ) ;
26
+ #[ derive( Debug , Serialize , Deserialize ) ]
27
+ struct Payload {
28
+ trainer_name : String ,
29
+ }
30
+
31
+ #[ derive( Serialize ) ]
32
+ pub struct APIError {
33
+ pub message : & ' static str ,
34
+ pub code : & ' static str ,
35
+ }
36
+
37
+ impl From < APIError > for Body {
38
+ fn from ( val : APIError ) -> Self {
39
+ Body :: Text ( serde_json:: to_string ( & val) . unwrap ( ) )
40
+ }
41
+ }
28
42
29
- let response = Response :: builder ( )
30
- . status ( StatusCode :: OK )
31
- . header ( "Content-Type" , "application/json" )
43
+ pub fn bad_request ( message : & ' static str ) -> Result < Response < Body > , Error > {
44
+ Ok ( Response :: builder ( )
45
+ . status ( StatusCode :: BAD_REQUEST )
46
+ . header ( "content-type" , "application/json" )
32
47
. body (
33
- json ! ( {
34
- "message" : format!( "I choose you, {}!" , starter) ,
35
- } )
48
+ APIError {
49
+ message,
50
+ code : "bad_request" ,
51
+ }
36
52
. into ( ) ,
37
- ) ?;
53
+ ) ?)
54
+ }
55
+
56
+ pub async fn handler ( req : Request ) -> Result < Response < Body > , Error > {
57
+ tracing:: info!( "Choosing a starter Pokemon" ) ;
58
+ let payload = req. payload :: < Payload > ( ) ;
59
+
60
+ match payload {
61
+ Err ( ..) => bad_request ( "Invalid payload" ) ,
62
+ Ok ( None ) => bad_request ( "Invalid payload" ) ,
63
+ Ok ( Some ( payload) ) => {
64
+ let starter = choose_starter ( ) ;
38
65
39
- Ok ( response)
66
+ Ok ( Response :: builder ( )
67
+ . status ( StatusCode :: OK )
68
+ . header ( "Content-Type" , "application/json" )
69
+ . body (
70
+ json ! ( {
71
+ "message" : format!( "{} says: I choose you, {}!" , payload. trainer_name, starter) ,
72
+ } )
73
+ . to_string ( )
74
+ . into ( ) ,
75
+ ) ?)
76
+ }
77
+ }
40
78
}
0 commit comments