1
+ use std:: collections:: HashMap ;
2
+ use std:: sync:: { Arc , Mutex } ;
3
+ use std:: io:: { self , Write } ;
4
+
5
+ type Db = Arc < Mutex < HashMap < String , String > > > ;
6
+
7
+ struct KvStore {
8
+ db : Db ,
9
+ }
10
+
11
+ impl KvStore {
12
+ fn new ( ) -> Self {
13
+ KvStore {
14
+ db : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
15
+ }
16
+ }
17
+
18
+ fn set ( & self , key : String , value : String ) {
19
+ let mut db = self . db . lock ( ) . unwrap ( ) ;
20
+ db. insert ( key, value) ;
21
+ }
22
+
23
+ fn get ( & self , key : String ) -> Option < String > {
24
+ let db = self . db . lock ( ) . unwrap ( ) ;
25
+ db. get ( & key) . cloned ( )
26
+ }
27
+
28
+ fn delete ( & self , key : String ) -> Option < String > {
29
+ let mut db = self . db . lock ( ) . unwrap ( ) ;
30
+ db. remove ( & key)
31
+ }
32
+ }
33
+
34
+ fn main ( ) {
35
+ let store = KvStore :: new ( ) ;
36
+ loop {
37
+ print ! ( "> " ) ;
38
+ io:: stdout ( ) . flush ( ) . unwrap ( ) ;
39
+ let mut input = String :: new ( ) ;
40
+ io:: stdin ( ) . read_line ( & mut input) . unwrap ( ) ;
41
+ let parts: Vec < & str > = input. trim ( ) . split_whitespace ( ) . collect ( ) ;
42
+ if parts. is_empty ( ) {
43
+ continue ;
44
+ }
45
+ match parts[ 0 ] {
46
+ "set" if parts. len ( ) == 3 => {
47
+ store. set ( parts[ 1 ] . to_string ( ) , parts[ 2 ] . to_string ( ) ) ;
48
+ println ! ( "OK" ) ;
49
+ }
50
+ "get" if parts. len ( ) == 2 => {
51
+ match store. get ( parts[ 1 ] . to_string ( ) ) {
52
+ Some ( value) => println ! ( "{}" , value) ,
53
+ None => println ! ( "Key not found" ) ,
54
+ }
55
+ }
56
+ "delete" if parts. len ( ) == 2 => {
57
+ match store. delete ( parts[ 1 ] . to_string ( ) ) {
58
+ Some ( _) => println ! ( "OK" ) ,
59
+ None => println ! ( "Key not found" ) ,
60
+ }
61
+ }
62
+ "exit" => break ,
63
+ _ => println ! ( "Unknown command" ) ,
64
+ }
65
+ }
66
+ }
0 commit comments