1
1
#![ feature( decl_macro) ]
2
+ #![ feature( try_trait) ]
2
3
3
4
#[ macro_use]
4
5
extern crate rocket;
5
6
6
7
use rocket:: State ;
8
+ use rocket:: { http:: Status , response:: Responder } ;
7
9
use rocket_contrib:: json:: Json ;
8
10
use serde:: { Deserialize , Serialize } ;
9
11
use sled_extensions:: bincode:: Tree ;
10
12
use sled_extensions:: DbExt ;
13
+ use std:: option:: NoneError ;
11
14
12
15
#[ derive( thiserror:: Error , Debug ) ]
13
16
pub enum ServerError {
14
17
#[ error( "sled db error" ) ]
15
18
SledError ( #[ from] sled_extensions:: Error ) ,
19
+ #[ error( "resource not found" ) ]
20
+ NotFound ,
21
+ }
22
+
23
+ impl From < NoneError > for ServerError {
24
+ fn from ( _: NoneError ) -> Self {
25
+ ServerError :: NotFound
26
+ }
27
+ }
28
+
29
+ impl < ' a > Responder < ' a > for ServerError {
30
+ fn respond_to ( self , _: & rocket:: Request ) -> Result < rocket:: Response < ' a > , Status > {
31
+ match self {
32
+ Self :: SledError ( _) => Err ( Status :: InternalServerError ) ,
33
+ Self :: NotFound => Err ( Status :: NotFound ) ,
34
+ }
35
+ }
16
36
}
17
37
18
38
struct Database {
@@ -34,7 +54,8 @@ fn get_user(db: State<Database>, username: String) -> EndpointResult<Json<User>>
34
54
35
55
#[ delete( "/users/<username>" ) ]
36
56
fn delete_user ( db : State < Database > , username : String ) -> EndpointResult < Json < User > > {
37
- todo ! ( )
57
+ let user = db. users . remove ( username. as_bytes ( ) ) ??;
58
+ Ok ( Json ( user) )
38
59
}
39
60
40
61
#[ put( "/users" , data = "<user>" ) ]
0 commit comments