use crate::messages::{Answer, Message};
use std::fmt::Debug;
use std::io::{self, Read, Write};
use std::net::{TcpListener, TcpStream};
#[derive(Debug)]
pub struct ExternalEditorApi {
pub listener: TcpListener,
}
impl ExternalEditorApi {
pub fn new() -> Self {
let listener = TcpListener::bind("127.0.0.1:39998").unwrap();
Self { listener }
}
pub fn send(&self, message: Message) -> io::Result<()> {
let mut stream = TcpStream::connect("127.0.0.1:39999")?;
let json_message = serde_json::to_string(&message).unwrap();
stream.write_all(json_message.as_bytes()).unwrap();
stream.flush().unwrap();
Ok(())
}
pub fn read(&self) -> Answer {
serde_json::from_str(&self.read_string()).unwrap()
}
pub fn read_string(&self) -> String {
let (mut stream, _addr) = self.listener.accept().unwrap();
let mut buffer = String::new();
stream.read_to_string(&mut buffer).unwrap();
buffer
}
pub fn wait<T: TryFrom<Answer>>(&self) -> T {
loop {
if let Ok(answer) = T::try_from(self.read()) {
return answer;
}
}
}
}
impl Default for ExternalEditorApi {
fn default() -> Self {
Self::new()
}
}