@@ -9,7 +9,63 @@ mod client;
9
9
pub use self :: server:: DaemonServer ;
10
10
mod server;
11
11
12
- pub trait Daemon {
12
+ pub trait DaemonClientTrait {
13
+ fn send_command ( & mut self , command : DaemonCommand ) -> Result < DaemonResponse , String > ;
14
+ }
15
+
16
+ // Define Daemon trait, DaemonCommand enum, and DaemonResponse enum
17
+ macro_rules! commands {
18
+ ( $( fn $func: ident( & mut self $( , ) ? $( $arg: ident: $type: ty ) ,* ) -> Result <$ret: ty, String >; ) * ) => {
19
+ pub trait Daemon {
20
+ $(
21
+ fn $func( & mut self , $( $arg: $type ) ,* ) -> Result <$ret, String >;
22
+ ) *
23
+
24
+ fn dispatch_command_to_method( & mut self , command: DaemonCommand ) -> Result <DaemonResponse , String > {
25
+ match command {
26
+ $(
27
+ DaemonCommand :: $func{ $( $arg ) ,* } => {
28
+ self . $func( $( $arg ) ,* ) . map( DaemonResponse :: $func)
29
+ }
30
+ ) *
31
+ }
32
+ }
33
+ }
34
+
35
+ #[ allow( non_camel_case_types) ]
36
+ #[ derive( Deserialize , Serialize ) ]
37
+ #[ serde( tag = "t" , content = "c" ) ]
38
+ pub enum DaemonCommand {
39
+ $(
40
+ $func{ $( $arg: $type ) ,* }
41
+ ) ,*
42
+ }
43
+
44
+ #[ allow( non_camel_case_types) ]
45
+ #[ derive( Deserialize , Serialize ) ]
46
+ #[ serde( tag = "t" , content = "c" ) ]
47
+ pub enum DaemonResponse {
48
+ $(
49
+ $func( $ret)
50
+ ) ,*
51
+ }
52
+
53
+ impl <T : DaemonClientTrait > Daemon for T {
54
+ $(
55
+ fn $func( & mut self , $( $arg: $type ) ,* ) -> Result <$ret, String > {
56
+ let res = self . send_command( DaemonCommand :: $func{ $( $arg ) ,* } ) ;
57
+ match res {
58
+ Ok ( DaemonResponse :: $func( ret) ) => Ok ( ret) ,
59
+ Ok ( _) => unreachable!( ) ,
60
+ Err ( err) => Err ( err) ,
61
+ }
62
+ }
63
+ ) *
64
+ }
65
+ } ;
66
+ }
67
+
68
+ commands ! {
13
69
fn boards( & mut self ) -> Result <Vec <String >, String >;
14
70
fn keymap_get( & mut self , board: usize , layer: u8 , output: u8 , input: u8 ) -> Result <u16 , String >;
15
71
fn keymap_set( & mut self , board: usize , layer: u8 , output: u8 , input: u8 , value: u16 ) -> Result <( ) , String >;
@@ -18,33 +74,13 @@ pub trait Daemon {
18
74
fn max_brightness( & mut self ) -> Result <i32 , String >;
19
75
fn brightness( & mut self ) -> Result <i32 , String >;
20
76
fn set_brightness( & mut self , brightness: i32 ) -> Result <( ) , String >;
77
+ fn exit( & mut self ) -> Result <( ) , String >;
21
78
}
22
79
23
80
fn err_str < E : std:: fmt:: Debug > ( err : E ) -> String {
24
81
format ! ( "{:?}" , err)
25
82
}
26
83
27
- #[ derive( Deserialize , Serialize ) ]
28
- #[ serde( tag = "kind" ) ]
29
- enum DaemonCommand {
30
- Boards ,
31
- KeymapGet { board : usize , layer : u8 , output : u8 , input : u8 } ,
32
- KeymapSet { board : usize , layer : u8 , output : u8 , input : u8 , value : u16 } ,
33
- MaxBrightness ,
34
- Brightness ,
35
- Color ,
36
- SetBrightness { brightness : i32 } ,
37
- SetColor { color : Rgb } ,
38
- Exit ,
39
- }
40
-
41
- #[ derive( Deserialize , Serialize ) ]
42
- #[ serde( untagged) ]
43
- enum DaemonResult {
44
- Ok { ok : String } ,
45
- Err { err : String } ,
46
- }
47
-
48
84
pub fn daemon_server ( ) -> Result < DaemonServer < io:: Stdin , io:: Stdout > , String > {
49
85
DaemonServer :: new ( io:: stdin ( ) , io:: stdout ( ) )
50
86
}
0 commit comments