1
1
use std:: num:: NonZero ;
2
+ use std:: sync:: Arc ;
2
3
use std:: thread:: available_parallelism;
3
4
4
5
use anyhow:: { anyhow, Result } ;
5
6
use connection:: Connection ;
6
7
use crossbeam_channel:: { Receiver , Sender } ;
8
+ use methods:: Handler ;
7
9
use scarb_proc_macro_server_types:: jsonrpc:: { ResponseError , RpcRequest , RpcResponse } ;
10
+ use scarb_proc_macro_server_types:: methods:: defined_macros:: DefinedMacros ;
11
+ use scarb_proc_macro_server_types:: methods:: Method ;
8
12
use serde_json:: Value ;
9
13
10
14
use crate :: compiler:: plugin:: proc_macro:: ProcMacroHost ;
11
15
12
16
mod connection;
17
+ mod methods;
13
18
14
- pub fn start_proc_macro_server ( _proc_macros : ProcMacroHost ) -> Result < ( ) > {
19
+ pub fn start_proc_macro_server ( proc_macros : ProcMacroHost ) -> Result < ( ) > {
15
20
let connection = Connection :: new ( ) ;
16
21
let available_parallelism = available_parallelism ( ) . map ( NonZero :: get) . unwrap_or ( 4 ) ;
22
+ let proc_macros = Arc :: new ( proc_macros) ;
17
23
18
24
for i in 0 ..available_parallelism {
19
25
let receiver = connection. receiver . clone ( ) ;
20
26
let sender = connection. sender . clone ( ) ;
27
+ let proc_macros = proc_macros. clone ( ) ;
21
28
22
29
std:: thread:: Builder :: new ( )
23
30
. name ( format ! ( "proc-macro-server-worker-thread-{i}" ) )
24
31
. spawn ( move || {
25
- handle_requests ( receiver, sender) ;
32
+ handle_requests ( proc_macros , receiver, sender) ;
26
33
} )
27
34
. expect ( "failed to spawn thread" ) ;
28
35
}
@@ -32,10 +39,14 @@ pub fn start_proc_macro_server(_proc_macros: ProcMacroHost) -> Result<()> {
32
39
Ok ( ( ) )
33
40
}
34
41
35
- fn handle_requests ( receiver : Receiver < RpcRequest > , sender : Sender < RpcResponse > ) {
42
+ fn handle_requests (
43
+ proc_macros : Arc < ProcMacroHost > ,
44
+ receiver : Receiver < RpcRequest > ,
45
+ sender : Sender < RpcResponse > ,
46
+ ) {
36
47
for request in receiver {
37
48
let id = request. id ;
38
- let response = route_request ( request) ;
49
+ let response = route_request ( proc_macros . clone ( ) , request) ;
39
50
40
51
let response = match response {
41
52
Ok ( result) => RpcResponse {
@@ -56,10 +67,14 @@ fn handle_requests(receiver: Receiver<RpcRequest>, sender: Sender<RpcResponse>)
56
67
}
57
68
}
58
69
59
- fn route_request ( request : RpcRequest ) -> Result < Value > {
60
- #[ allow( clippy:: match_single_binding) ]
70
+ fn route_request ( proc_macros : Arc < ProcMacroHost > , request : RpcRequest ) -> Result < Value > {
61
71
match request. method . as_str ( ) {
62
- //TODO add method handlers
72
+ DefinedMacros :: METHOD => run_handler :: < DefinedMacros > ( proc_macros . clone ( ) , request . value ) ,
63
73
_ => Err ( anyhow ! ( "method not found" ) ) ,
64
74
}
65
75
}
76
+
77
+ fn run_handler < M : Handler > ( proc_macros : Arc < ProcMacroHost > , value : Value ) -> Result < Value > {
78
+ M :: handle ( proc_macros, serde_json:: from_value ( value) . unwrap ( ) )
79
+ . map ( |res| serde_json:: to_value ( res) . unwrap ( ) )
80
+ }
0 commit comments