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
use std::io;
use serde::Deserialize;
use tokio::io::{AsyncBufReadExt, BufReader};
use tokio::net::process::ChildStdout;
use crate::agda::ReplState;
use crate::debug::debug_response;
use crate::resp::Resp;
pub fn deserialize_agda<'a, T: Deserialize<'a>>(buf: &'a str) -> serde_json::Result<T> {
let buf = buf.trim_start_matches("JSON>").trim();
serde_json::from_str(buf)
}
pub struct AgdaRead {
buf: String,
agda: BufReader<ChildStdout>,
}
impl From<BufReader<ChildStdout>> for AgdaRead {
fn from(agda: BufReader<ChildStdout>) -> Self {
Self {
agda,
buf: String::with_capacity(2048),
}
}
}
impl From<ChildStdout> for AgdaRead {
fn from(o: ChildStdout) -> Self {
From::from(BufReader::new(o))
}
}
impl AgdaRead {
pub async fn response(&mut self) -> io::Result<Resp> {
self.agda.read_line(&mut self.buf).await?;
unsafe { debug_response(format!("[RES]: {}\n", self.buf)) };
let resp = deserialize_agda(&self.buf)?;
self.buf.clear();
Ok(resp)
}
}
impl ReplState {
pub async fn response(&mut self) -> io::Result<Resp> {
self.agda.response().await
}
}