1- use crate :: common:: { Command , GetResponse , KvsEngine , RemoveResponse , SetResponse } ;
1+ use crate :: common:: KvsEngine ;
22use crate :: error:: Result ;
3+ use crate :: net:: { Request , Response } ;
34use serde_json:: Deserializer ;
45use slog:: { debug, error, info, Logger } ;
56use std:: io:: { BufReader , BufWriter , Write } ;
@@ -20,55 +21,51 @@ impl<T: KvsEngine> Server<T> {
2021 }
2122 Ok ( ( ) )
2223 }
23-
2424 fn handle_client ( & mut self , stream : TcpStream , logger : & Logger ) -> Result < ( ) > {
2525 let peer_addr = stream. peer_addr ( ) ?;
2626 let reader = BufReader :: new ( & stream) ;
2727 let mut writer = BufWriter :: new ( & stream) ;
28- let requests = Deserializer :: from_reader ( reader) . into_iter :: < Command > ( ) ;
28+ let requests = Deserializer :: from_reader ( reader) . into_iter :: < Request > ( ) ;
29+
30+ for request in requests {
31+ if let Ok ( request) = request {
32+ info ! ( logger, "request:" ; "request" => format!( "{:?}" , request) ) ;
33+
34+ let response = match request {
35+ Request :: Get { key } => match self . engine . get ( key) {
36+ Ok ( v) => Response :: Get ( Ok ( v) ) ,
37+ Err ( e) => Response :: Get ( Err ( e. to_string ( ) ) ) ,
38+ } ,
39+ Request :: Remove { key } => match self . engine . remove ( key) {
40+ Ok ( _) => Response :: Remove ( Ok ( ( ) ) ) ,
41+ Err ( e) => Response :: Remove ( Err ( e. as_string ( ) ) ) ,
42+ } ,
43+ Request :: Set { key, value } => match self . engine . set ( key, value) {
44+ Ok ( ( ) ) => Response :: Set ( Ok ( ( ) ) ) ,
45+ Err ( e) => Response :: Set ( Err ( e. to_string ( ) ) ) ,
46+ } ,
47+ } ;
48+
49+ self . send_response ( & mut writer, & response) ?;
2950
30- macro_rules! respond {
31- ( $response: expr) => { {
32- let response = $response;
33- serde_json:: to_writer( & mut writer, & response) ?;
34- writer. flush( ) ?;
3551 debug ! (
3652 logger,
3753 "Response sent to" ;
3854 "addr" => format!( "{}" , peer_addr) ,
3955 "response" => format!( "{:?}" , response)
4056 ) ;
41- } ; } ;
42- }
43-
44- for request in requests {
45- if let Ok ( request) = request {
46- info ! ( logger, "request:" ; "request" => format!( "{:?}" , request) ) ;
47- match request {
48- Command :: Get { key } => {
49- respond ! ( match self . engine. get( key) {
50- Ok ( v) => GetResponse :: Ok ( v) ,
51- Err ( e) => GetResponse :: Err ( e. as_string( ) ) ,
52- } )
53- }
54- Command :: Remove { key } => {
55- respond ! ( match self . engine. remove( key) {
56- Ok ( _) => RemoveResponse :: Ok ( ( ) ) ,
57- Err ( e) => RemoveResponse :: Err ( e. as_string( ) ) ,
58- } )
59- }
60- Command :: Set { key, value } => {
61- respond ! ( match self . engine. set( key, value) {
62- Ok ( ( ) ) => SetResponse :: Ok ( ( ) ) ,
63- Err ( e) => SetResponse :: Err ( e. as_string( ) ) ,
64- } )
65- }
66- }
67- writer. flush ( ) ?;
57+ // write response
6858 } else {
6959 error ! ( logger, "can not parse the request" ) ;
7060 }
7161 }
7262 Ok ( ( ) )
7363 }
64+
65+ fn send_response ( & self , writer : & mut BufWriter < & TcpStream > , response : & Response ) -> Result < ( ) > {
66+ let buf = serde_json:: to_vec ( response) ?;
67+ writer. write_all ( & buf[ ..] ) ?;
68+ writer. flush ( ) ?;
69+ Ok ( ( ) )
70+ }
7471}
0 commit comments