use serde_json::Value;
use std::io;
use async_trait::async_trait;
#[async_trait]
pub trait WireConn: Send {
async fn read_msg(&mut self) -> io::Result<Option<Value>>;
async fn write_msg(&mut self, msg: &Value) -> io::Result<()>;
}
#[async_trait]
pub trait WireListener: Send + Sync {
async fn accept(&self) -> io::Result<Box<dyn WireConn>>;
fn local_addr(&self) -> io::Result<String>;
}
#[async_trait]
pub trait Transport: Send + Sync {
async fn listen(&self, addr: &str) -> io::Result<Box<dyn WireListener>>;
async fn connect(&self, addr: &str) -> io::Result<Box<dyn WireConn>>;
fn name(&self) -> &'static str;
}