1pub mod codec;
2pub mod error;
3
4pub use codec::{
5 decode_request, decode_response, encode_request, encode_response, read_frame, write_frame,
6};
7pub use error::CodecError;
8
9use std::env;
10use std::io;
11use std::os::unix::net::UnixStream;
12use std::path::PathBuf;
13
14use halley_api::{Request, Response};
15
16pub fn default_socket_path() -> io::Result<PathBuf> {
17 let runtime_dir = env::var_os("XDG_RUNTIME_DIR")
18 .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "XDG_RUNTIME_DIR is not set"))?;
19 Ok(PathBuf::from(runtime_dir)
20 .join("halley")
21 .join("halley.sock"))
22}
23
24pub fn send_request(req: &Request) -> Result<Response, CodecError> {
25 let path = default_socket_path()?;
26 send_request_to(&path, req)
27}
28
29pub fn send_request_to(path: &std::path::Path, req: &Request) -> Result<Response, CodecError> {
30 let mut stream = UnixStream::connect(path)?;
31 let bytes = encode_request(req)?;
32 write_frame(&mut stream, &bytes)?;
33
34 let resp_bytes = read_frame(&mut stream)?;
35 decode_response(&resp_bytes)
36}