use crate::network::{RemoteAddr};
use mio::event::{Source};
use std::net::{SocketAddr};
use std::io::{self};
pub trait Adapter: Send + Sync {
type Remote: Remote;
type Local: Local<Remote = Self::Remote>;
}
pub trait Resource: Send + Sync {
fn source(&mut self) -> &mut dyn Source;
}
pub struct ConnectionInfo<R: Remote> {
pub remote: R,
pub local_addr: SocketAddr,
pub peer_addr: SocketAddr,
}
pub struct ListeningInfo<L: Local> {
pub local: L,
pub local_addr: SocketAddr,
}
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum SendStatus {
Sent,
MaxPacketSizeExceeded(usize, usize),
ResourceNotFound,
}
pub enum ReadStatus {
Disconnected,
WaitNextEvent,
}
pub trait Remote: Resource + Sized {
fn connect(remote_addr: RemoteAddr) -> io::Result<ConnectionInfo<Self>>;
fn receive(&self, process_data: impl FnMut(&[u8])) -> ReadStatus;
fn send(&self, data: &[u8]) -> SendStatus;
}
pub enum AcceptedType<'a, R> {
Remote(SocketAddr, R),
Data(SocketAddr, &'a [u8]),
}
pub trait Local: Resource + Sized {
type Remote: Remote;
fn listen(addr: SocketAddr) -> io::Result<ListeningInfo<Self>>;
fn accept(&self, accept_remote: impl FnMut(AcceptedType<'_, Self::Remote>));
fn send_to(&self, _addr: SocketAddr, _data: &[u8]) -> SendStatus {
panic!("Adapter not configured to send messages directly from the local resource")
}
}