1+ use std:: collections:: HashMap ;
2+ use std:: sync:: { Arc , Mutex } ;
3+ use tonic:: { transport:: Server , Request , Response , Status } ;
4+
5+ use dstore:: dstore_proto:: dstore_server:: { Dstore , DstoreServer } ;
6+ use dstore:: dstore_proto:: { GetArg , SetArg , GetResult , SetResult } ;
7+ struct Store {
8+ db : Arc < Mutex < HashMap < String , String > > >
9+ }
10+
11+ impl Store {
12+ fn new ( db : Arc < Mutex < HashMap < String , String > > > ) -> Self {
13+ Self { db }
14+ }
15+ }
16+
17+ #[ tonic:: async_trait]
18+ impl Dstore for Store {
19+ async fn set ( & self , set_arg : Request < SetArg > ) -> Result < Response < SetResult > , Status > {
20+ let mut db = self . db . lock ( ) . unwrap ( ) ;
21+ let args = set_arg. into_inner ( ) ;
22+ match db. contains_key ( & args. key ) {
23+ true => Ok ( Response :: new ( SetResult { success : false } ) ) ,
24+ false => {
25+ db. insert ( args. key , args. value ) ;
26+ Ok ( Response :: new ( SetResult { success : true } ) )
27+ }
28+ }
29+ }
30+
31+ async fn get ( & self , get_arg : Request < GetArg > ) -> Result < Response < GetResult > , Status > {
32+ let db = self . db . lock ( ) . unwrap ( ) ;
33+ let args = get_arg. into_inner ( ) ;
34+ match db. get ( & args. key ) {
35+ Some ( val) => Ok ( Response :: new ( GetResult { value : val. clone ( ) , success : true } ) ) ,
36+ None => Ok ( Response :: new ( GetResult { value : "" . to_string ( ) , success : false } ) )
37+ }
38+ }
39+
40+ async fn del ( & self , del_arg : Request < GetArg > ) -> Result < Response < SetResult > , Status > {
41+ let mut db = self . db . lock ( ) . unwrap ( ) ;
42+ let args = del_arg. into_inner ( ) ;
43+ match db. contains_key ( & args. key ) {
44+ false => Ok ( Response :: new ( SetResult { success : false } ) ) ,
45+ true => {
46+ db. remove ( & args. key ) ;
47+ Ok ( Response :: new ( SetResult { success : true } ) )
48+ }
49+ }
50+ }
51+ }
52+
53+ #[ tokio:: main]
54+ async fn main ( ) {
55+ let addr = "127.0.0.1:50051" . parse ( ) . unwrap ( ) ;
56+ let global_store = Arc :: new ( Mutex :: new ( HashMap :: < String , String > :: new ( ) ) ) ;
57+
58+ println ! ( "Dstore server listening on {}" , addr) ;
59+
60+ Server :: builder ( ) . add_service ( DstoreServer :: new ( Store :: new ( global_store) ) ) . serve ( addr) . await ;
61+ }
0 commit comments