use anyhow::{Context, Result, anyhow}; use niri_ipc::{Reply, Request, Response}; use smol::{ io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::unix::UnixStream, }; use std::env; pub async fn query(socket: &mut BufReader, req: Request) -> Result { let req = serde_json::to_string(&req)?; tracing::debug!("sending request: {}", req); socket.write_all(&[req.as_bytes(), b"\n"].concat()).await?; socket.flush().await?; let mut rep = String::new(); socket.read_line(&mut rep).await?; Ok(serde_json::from_str(&rep)?) } pub async fn tell(socket: &mut BufReader, req: Request) -> Result<()> { let rep = query(socket, req).await?; if let Reply::Ok(Response::Handled) = rep { Ok(()) } else { Err(anyhow!( "Expected Reply::Ok(Response::Handled), got {}", rep.unwrap_err() )) } } pub async fn create_niri_socket() -> Result> { let socket_path = env::var(niri_ipc::socket::SOCKET_PATH_ENV) .context("Couldn't find Niri socket path ($NIRI_SOCKET) in environment")?; tracing::debug!("socket path is: {}", socket_path); let raw = UnixStream::connect(&socket_path).await?; Ok(BufReader::new(raw)) }