use crate::{BorrowedPacket, DataLink, LibraryVersion, Error, InterfaceDescription, Stats};
use std::iter::IntoIterator;
use std::sync::Arc;
pub trait DynamicInterface<'a>: Send + Sync{
fn send(&self, packet: &[u8]) -> Result<(), Error>;
fn receive<'b>(&'b mut self) -> Result<BorrowedPacket<'b>, Error>;
fn flush(&self);
fn data_link(&self) -> DataLink;
fn stats(&self) -> Result<Stats, Error>;
fn break_loop(& self);
fn loop_infinite_dyn(&self, callback: & dyn FnMut(&BorrowedPacket)) -> Result<(), Error>;
}
pub trait StaticInterface<'a>: DynamicInterface<'a> {
fn loop_infinite<F>(& self, callback: F) -> Result<(), Error> where F: FnMut(&BorrowedPacket);
}
pub trait Library: Send+Sync{
fn open_default_paths() -> Result<Self, Error> where Self: Sized {
Self::open_paths(Self::default_paths().iter().map(|s|*s))
}
fn default_paths() -> &'static[&'static str] where Self: Sized;
fn open_paths<'b, T>(paths: T) -> Result<Self, Error> where Self: Sized, T:IntoIterator<Item=&'b str>{
let mut err = Error::NoPathsProvided;
for path in paths.into_iter(){
match Self::open(path) {
Err(e) => err = e,
Ok(lib) => return Ok(lib)
}
}
Err(err)
}
fn open(path: &str) -> Result<Self, Error> where Self: Sized;
fn open_interface<'a>(&'a self, name: &str) -> Result<Box<dyn DynamicInterface<'a>+'a>, Error>;
fn open_interface_arc<'a>(&'a self, name: &str) -> Result<Arc<DynamicInterface<'a> + 'a>, Error>;
fn all_interfaces(&self) -> Result<Vec<InterfaceDescription>, Error>;
fn version(&self) -> LibraryVersion;
}