use crate::errors::Error;
use crate::io::private::TraitToAny;
use dyn_clone::DynClone;
use std::fmt::{Debug, Display};
use std::time::Duration;
mod serial;
pub use serial::Serial;
pub(crate) mod private {
use std::any::Any;
pub trait TraitToAny: 'static {
fn as_any(&self) -> &dyn Any;
}
impl<T: 'static> TraitToAny for T {
fn as_any(&self) -> &dyn Any {
self
}
}
}
dyn_clone::clone_trait_object!(IoTransport);
#[cfg_attr(feature = "serde", typetag::serde(tag = "type"))]
pub trait IoTransport: Debug + Display + DynClone + Send + Sync + TraitToAny {
fn open(&mut self) -> Result<(), Error>;
fn close(&mut self) -> Result<(), Error>;
fn set_timeout(&mut self, duration: Duration) -> Result<(), Error>;
fn write(&mut self, buf: &[u8]) -> Result<(), Error>;
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>;
}