11use anyhow:: Result ;
22use serde:: { Deserialize , Serialize } ;
3- use spin_sdk:: { http:: { Method , Request , Response } , http_component, sqlite:: { Connection , Value } } ;
3+ use spin_sdk:: {
4+ http:: { Method , Request , Response } ,
5+ http_component,
6+ sqlite:: { Connection , Value } ,
7+ } ;
48use urlencoding:: decode;
59
610#[ derive( Serialize , Deserialize ) ]
@@ -22,7 +26,14 @@ fn handle_e2e(req: Request) -> Result<Response> {
2226 ( m, "/test/users-add" ) if * m == Method :: Get => users_add_via_query ( req) ,
2327 ( m, "/txn/commit" ) if * m == Method :: Post || * m == Method :: Get => txn_commit ( ) ,
2428 ( m, "/txn/rollback" ) if * m == Method :: Post || * m == Method :: Get => txn_rollback ( ) ,
25- _ => json ( 404 , & ApiResponse :: < ( ) > { ok : false , data : None , error : Some ( "not found" . into ( ) ) } ) ,
29+ _ => json (
30+ 404 ,
31+ & ApiResponse :: < ( ) > {
32+ ok : false ,
33+ data : None ,
34+ error : Some ( "not found" . into ( ) ) ,
35+ } ,
36+ ) ,
2637 }
2738}
2839
@@ -38,14 +49,27 @@ fn json<T: Serialize>(status: u16, val: &T) -> Result<Response> {
3849fn setup ( ) -> Result < Response > {
3950 let db = Connection :: open_default ( ) ?;
4051 db. execute ( "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT)" , & [ ] ) ?;
41- db. execute ( "CREATE TABLE IF NOT EXISTS accounts (id INTEGER PRIMARY KEY AUTOINCREMENT, balance INTEGER)" , & [ ] ) ?;
52+ db. execute (
53+ "CREATE TABLE IF NOT EXISTS accounts (id INTEGER PRIMARY KEY AUTOINCREMENT, balance INTEGER)" ,
54+ & [ ] ,
55+ ) ?;
4256 db. execute ( "DELETE FROM users" , & [ ] ) ?;
4357 db. execute ( "DELETE FROM accounts" , & [ ] ) ?;
44- json ( 200 , & ApiResponse :: < ( ) > { ok : true , data : None , error : None } )
58+ json (
59+ 200 ,
60+ & ApiResponse :: < ( ) > {
61+ ok : true ,
62+ data : None ,
63+ error : None ,
64+ } ,
65+ )
4566}
4667
4768#[ derive( Deserialize ) ]
48- struct NewUser { name : String , email : String }
69+ struct NewUser {
70+ name : String ,
71+ email : String ,
72+ }
4973
5074fn create_user ( req : Request ) -> Result < Response > {
5175 let db = Connection :: open_default ( ) ?;
@@ -55,11 +79,22 @@ fn create_user(req: Request) -> Result<Response> {
5579 "INSERT INTO users (name, email) VALUES (?, ?)" ,
5680 & [ Value :: Text ( nu. name ) , Value :: Text ( nu. email ) ] ,
5781 ) ?;
58- json ( 200 , & ApiResponse :: < ( ) > { ok : true , data : None , error : None } )
82+ json (
83+ 200 ,
84+ & ApiResponse :: < ( ) > {
85+ ok : true ,
86+ data : None ,
87+ error : None ,
88+ } ,
89+ )
5990}
6091
6192#[ derive( Serialize ) ]
62- struct UserOut { id : i64 , name : String , email : String }
93+ struct UserOut {
94+ id : i64 ,
95+ name : String ,
96+ email : String ,
97+ }
6398
6499fn list_users ( ) -> Result < Response > {
65100 let db = Connection :: open_default ( ) ?;
@@ -69,9 +104,20 @@ fn list_users() -> Result<Response> {
69104 let id: i64 = row. get ( 0 ) . unwrap_or_default ( ) ;
70105 let name: & str = row. get ( 1 ) . unwrap_or ( "" ) ;
71106 let email: & str = row. get ( 2 ) . unwrap_or ( "" ) ;
72- users. push ( UserOut { id, name : name. to_string ( ) , email : email. to_string ( ) } ) ;
107+ users. push ( UserOut {
108+ id,
109+ name : name. to_string ( ) ,
110+ email : email. to_string ( ) ,
111+ } ) ;
73112 }
74- json ( 200 , & ApiResponse { ok : true , data : Some ( users) , error : None } )
113+ json (
114+ 200 ,
115+ & ApiResponse {
116+ ok : true ,
117+ data : Some ( users) ,
118+ error : None ,
119+ } ,
120+ )
75121}
76122
77123fn users_add_via_query ( req : Request ) -> Result < Response > {
@@ -80,7 +126,7 @@ fn users_add_via_query(req: Request) -> Result<Response> {
80126 let mut name: Option < String > = None ;
81127 let mut email: Option < String > = None ;
82128 if let Some ( idx) = qs. find ( '?' ) {
83- let q = & qs[ idx+ 1 ..] ;
129+ let q = & qs[ idx + 1 ..] ;
84130 for pair in q. split ( '&' ) {
85131 let mut it = pair. splitn ( 2 , '=' ) ;
86132 if let ( Some ( k) , Some ( v) ) = ( it. next ( ) , it. next ( ) ) {
@@ -99,9 +145,23 @@ fn users_add_via_query(req: Request) -> Result<Response> {
99145 "INSERT INTO users (name, email) VALUES (?, ?)" ,
100146 & [ Value :: Text ( n) , Value :: Text ( e) ] ,
101147 ) ?;
102- json ( 200 , & ApiResponse :: < ( ) > { ok : true , data : None , error : None } )
148+ json (
149+ 200 ,
150+ & ApiResponse :: < ( ) > {
151+ ok : true ,
152+ data : None ,
153+ error : None ,
154+ } ,
155+ )
103156 }
104- _ => json ( 400 , & ApiResponse :: < ( ) > { ok : false , data : None , error : Some ( "missing name or email" . into ( ) ) } )
157+ _ => json (
158+ 400 ,
159+ & ApiResponse :: < ( ) > {
160+ ok : false ,
161+ data : None ,
162+ error : Some ( "missing name or email" . into ( ) ) ,
163+ } ,
164+ ) ,
105165 }
106166}
107167
@@ -110,25 +170,51 @@ fn txn_commit() -> Result<Response> {
110170 db. execute ( "DELETE FROM accounts" , & [ ] ) ?;
111171 db. execute ( "INSERT INTO accounts (balance) VALUES (100), (200)" , & [ ] ) ?;
112172 db. execute ( "BEGIN" , & [ ] ) ?;
113- db. execute ( "UPDATE accounts SET balance = balance - 50 WHERE id = 1" , & [ ] ) ?;
114- db. execute ( "UPDATE accounts SET balance = balance + 50 WHERE id = 2" , & [ ] ) ?;
173+ db. execute (
174+ "UPDATE accounts SET balance = balance - 50 WHERE id = 1" ,
175+ & [ ] ,
176+ ) ?;
177+ db. execute (
178+ "UPDATE accounts SET balance = balance + 50 WHERE id = 2" ,
179+ & [ ] ,
180+ ) ?;
115181 db. execute ( "COMMIT" , & [ ] ) ?;
116182 let qr = db. execute ( "SELECT balance FROM accounts ORDER BY id" , & [ ] ) ?;
117183 let b0: i64 = qr. rows . first ( ) . and_then ( |r| r. get ( 0 ) ) . unwrap_or_default ( ) ;
118184 let b1: i64 = qr. rows . get ( 1 ) . and_then ( |r| r. get ( 0 ) ) . unwrap_or_default ( ) ;
119- json ( 200 , & ApiResponse { ok : true , data : Some ( vec ! [ b0, b1] ) , error : None } )
185+ json (
186+ 200 ,
187+ & ApiResponse {
188+ ok : true ,
189+ data : Some ( vec ! [ b0, b1] ) ,
190+ error : None ,
191+ } ,
192+ )
120193}
121194
122195fn txn_rollback ( ) -> Result < Response > {
123196 let db = Connection :: open_default ( ) ?;
124197 db. execute ( "DELETE FROM accounts" , & [ ] ) ?;
125198 db. execute ( "INSERT INTO accounts (balance) VALUES (100), (200)" , & [ ] ) ?;
126199 db. execute ( "BEGIN" , & [ ] ) ?;
127- db. execute ( "UPDATE accounts SET balance = balance - 50 WHERE id = 1" , & [ ] ) ?;
128- db. execute ( "UPDATE accounts SET balance = balance + 50 WHERE id = 2" , & [ ] ) ?;
200+ db. execute (
201+ "UPDATE accounts SET balance = balance - 50 WHERE id = 1" ,
202+ & [ ] ,
203+ ) ?;
204+ db. execute (
205+ "UPDATE accounts SET balance = balance + 50 WHERE id = 2" ,
206+ & [ ] ,
207+ ) ?;
129208 db. execute ( "ROLLBACK" , & [ ] ) ?;
130209 let qr = db. execute ( "SELECT balance FROM accounts ORDER BY id" , & [ ] ) ?;
131210 let b0: i64 = qr. rows . first ( ) . and_then ( |r| r. get ( 0 ) ) . unwrap_or_default ( ) ;
132211 let b1: i64 = qr. rows . get ( 1 ) . and_then ( |r| r. get ( 0 ) ) . unwrap_or_default ( ) ;
133- json ( 200 , & ApiResponse { ok : true , data : Some ( vec ! [ b0, b1] ) , error : None } )
212+ json (
213+ 200 ,
214+ & ApiResponse {
215+ ok : true ,
216+ data : Some ( vec ! [ b0, b1] ) ,
217+ error : None ,
218+ } ,
219+ )
134220}
0 commit comments