Skip to content

Commit d58f2fd

Browse files
authored
Add request handling (#1682)
**Stack**: - #1686 - #1685 - #1684 - #1683 - #1718 - #1682⚠️ *Part of a stack created by [spr](https://github.com/ejoffe/spr). Do not merge manually using the UI - doing so may have unexpected results.*
1 parent 00c317b commit d58f2fd

File tree

1 file changed

+53
-3
lines changed
  • scarb/src/ops/proc_macro_server

1 file changed

+53
-3
lines changed
+53-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,65 @@
1-
use crate::compiler::plugin::proc_macro::ProcMacroHost;
2-
use anyhow::Result;
1+
use std::num::NonZero;
2+
use std::thread::available_parallelism;
3+
4+
use anyhow::{anyhow, Result};
35
use connection::Connection;
6+
use crossbeam_channel::{Receiver, Sender};
7+
use scarb_proc_macro_server_types::jsonrpc::{ResponseError, RpcRequest, RpcResponse};
8+
use serde_json::Value;
9+
10+
use crate::compiler::plugin::proc_macro::ProcMacroHost;
411

512
mod connection;
613

714
pub fn start_proc_macro_server(_proc_macros: ProcMacroHost) -> Result<()> {
815
let connection = Connection::new();
16+
let available_parallelism = available_parallelism().map(NonZero::get).unwrap_or(4);
17+
18+
for i in 0..available_parallelism {
19+
let receiver = connection.receiver.clone();
20+
let sender = connection.sender.clone();
921

10-
//TODO
22+
std::thread::Builder::new()
23+
.name(format!("proc-macro-server-worker-thread-{i}"))
24+
.spawn(move || {
25+
handle_requests(receiver, sender);
26+
})
27+
.expect("failed to spawn thread");
28+
}
1129

1230
connection.join();
1331

1432
Ok(())
1533
}
34+
35+
fn handle_requests(receiver: Receiver<RpcRequest>, sender: Sender<RpcResponse>) {
36+
for request in receiver {
37+
let id = request.id;
38+
let response = route_request(request);
39+
40+
let response = match response {
41+
Ok(result) => RpcResponse {
42+
id,
43+
result: Some(result),
44+
error: None,
45+
},
46+
Err(error) => RpcResponse {
47+
id,
48+
result: None,
49+
error: Some(ResponseError {
50+
message: error.to_string(),
51+
}),
52+
},
53+
};
54+
55+
sender.send(response).unwrap();
56+
}
57+
}
58+
59+
fn route_request(request: RpcRequest) -> Result<Value> {
60+
#[allow(clippy::match_single_binding)]
61+
match request.method.as_str() {
62+
//TODO add method handlers
63+
_ => Err(anyhow!("method not found")),
64+
}
65+
}

0 commit comments

Comments
 (0)