use std::io::{self, BufRead, BufReader, Write};
use serde_json::Value;
use syntaqlite::any::AnyDialect;
use syntaqlite::rpc::{self, RpcSession};
pub(crate) fn run(dialect: &AnyDialect) -> Result<(), String> {
let stdin = io::stdin();
let stdout = io::stdout();
let mut reader = BufReader::new(stdin.lock());
let mut writer = io::BufWriter::new(stdout.lock());
writeln!(writer, "READY").map_err(|e| format!("write READY: {e}"))?;
writer.flush().map_err(|e| format!("flush READY: {e}"))?;
let mut session = RpcSession::new(dialect);
let mut line = String::new();
loop {
line.clear();
let n = reader
.read_line(&mut line)
.map_err(|e| format!("read: {e}"))?;
if n == 0 {
return Ok(()); }
let trimmed = line.trim_end_matches(['\n', '\r']);
if trimmed.is_empty() {
continue;
}
if let Ok(v) = serde_json::from_str::<Value>(trimmed)
&& v.get("op").and_then(Value::as_str) == Some("quit")
{
return Ok(());
}
let response = rpc::call_json(&mut session, trimmed);
writer
.write_all(response.as_bytes())
.map_err(|e| format!("write: {e}"))?;
writer.write_all(b"\n").map_err(|e| format!("write: {e}"))?;
writer.flush().map_err(|e| format!("flush: {e}"))?;
}
}