mod error;
pub use error::*;
pub fn query<MS: Into<u64>>(query: &str, timeout_ms: MS) -> Result<String, XQError> {
const N: usize = 100;
let mut response = [0; N];
let n = query_buffer(query, &mut response, timeout_ms.into())?;
let s = std::str::from_utf8(&response[..n])?;
Ok(s.to_string())
}
#[cfg(unix)]
pub fn query_buffer<MS: Into<u64>>(
query: &str,
buffer: &mut [u8],
timeout_ms: MS,
) -> Result<usize, XQError> {
use mio::{unix::SourceFd, Events, Interest, Poll, Token};
use std::{
fs::File,
io::{self, Read, Write},
os::fd::AsRawFd,
};
let stdout = io::stdout();
let mut stdout = stdout.lock();
write!(stdout, "{}", query)?;
stdout.flush()?;
let mut stdin = File::open("/dev/tty")?;
let mut poll = Poll::new()?;
let mut events = Events::with_capacity(1024);
let stdin_raw_fd = stdin.as_raw_fd();
let mut stdin_fd = SourceFd(&stdin_raw_fd); poll.registry()
.register(&mut stdin_fd, Token(0), Interest::READABLE)?;
let timeout = std::time::Duration::from_millis(timeout_ms.into());
poll.poll(&mut events, Some(timeout))?;
for event in &events {
if event.token() == Token(0) {
let bytes_written = stdin.read(buffer)?;
return Ok(bytes_written);
}
}
Err(XQError::Timeout) }
#[cfg(not(unix))]
pub fn query_buffer(_query: &str, _buffer: &mut [u8], _timeout_ms: u64) -> Result<usize, XQError> {
Err(XQError::Unsupported)
}