1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
use std::{
io::{self, BufRead, BufReader, BufWriter, Read},
path::PathBuf,
};
use serde::{de::DeserializeOwned, Serialize};
#[cfg(unix)]
use std::os::unix::net::{UnixListener, UnixStream};
#[cfg(windows)]
use uds_windows::{UnixListener, UnixStream};
fn socket_path() -> PathBuf {
std::env::temp_dir().join("texlab.sock")
}
pub fn send_request<T: Serialize>(msg: T) -> io::Result<()> {
let stream = UnixStream::connect(socket_path())?;
let mut conn = BufWriter::new(stream);
serde_json::to_writer(&mut conn, &msg)?;
Ok(())
}
pub fn spawn_server<T, F>(mut event_handler: F) -> io::Result<()>
where
T: DeserializeOwned,
F: FnMut(T) + Send + 'static,
{
let socket_path = socket_path();
let _ = std::fs::remove_file(&socket_path);
let listener = UnixListener::bind(socket_path)?;
std::thread::spawn(move || {
for conn in listener.incoming().flatten() {
let _ = handle_request(conn, &mut event_handler);
}
});
Ok(())
}
fn handle_request<T, F>(conn: impl Read, event_handler: &mut F) -> io::Result<()>
where
T: DeserializeOwned,
F: FnMut(T),
{
let mut conn = BufReader::new(conn);
let mut line = String::new();
conn.read_line(&mut line)?;
let msg = serde_json::from_str(&line)?;
event_handler(msg);
Ok(())
}
|