aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_proc_macro_srv/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_proc_macro_srv/src/main.rs')
-rw-r--r--crates/ra_proc_macro_srv/src/main.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/crates/ra_proc_macro_srv/src/main.rs b/crates/ra_proc_macro_srv/src/main.rs
new file mode 100644
index 000000000..54ce0224d
--- /dev/null
+++ b/crates/ra_proc_macro_srv/src/main.rs
@@ -0,0 +1,53 @@
1use ra_proc_macro::msg::{self, Message};
2use ra_proc_macro_srv::{expand_task, list_macros};
3
4use std::io;
5
6fn read_request() -> Result<Option<msg::Request>, io::Error> {
7 let stdin = io::stdin();
8 let mut stdin = stdin.lock();
9 msg::Request::read(&mut stdin)
10}
11
12fn write_response(res: Result<msg::Response, String>) -> Result<(), io::Error> {
13 let msg: msg::Response = match res {
14 Ok(res) => res,
15 Err(err) => msg::Response::Error(msg::ResponseError {
16 code: msg::ErrorCode::ExpansionError,
17 message: err,
18 }),
19 };
20
21 let stdout = io::stdout();
22 let mut stdout = stdout.lock();
23 msg.write(&mut stdout)
24}
25fn main() {
26 loop {
27 let req = match read_request() {
28 Err(err) => {
29 eprintln!("Read message error on ra_proc_macro_srv: {}", err.to_string());
30 continue;
31 }
32 Ok(None) => continue,
33 Ok(Some(req)) => req,
34 };
35
36 match req {
37 msg::Request::ListMacro(task) => {
38 if let Err(err) =
39 write_response(list_macros(&task).map(|it| msg::Response::ListMacro(it)))
40 {
41 eprintln!("Write message error on list macro: {}", err);
42 }
43 }
44 msg::Request::ExpansionMacro(task) => {
45 if let Err(err) =
46 write_response(expand_task(&task).map(|it| msg::Response::ExpansionMacro(it)))
47 {
48 eprintln!("Write message error on expansion macro: {}", err);
49 }
50 }
51 }
52 }
53}