use crate::network::transport::{TransportConnect, TransportListen};
use super::remote_addr::{RemoteAddr};
use super::poll::{Readiness};
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, Eq, Debug)]
pub enum SendStatus {
Sent,
MaxPacketSizeExceeded,
ResourceNotFound,
ResourceNotAvailable,
}
#[derive(Debug)]
pub enum ReadStatus {
Disconnected,
WaitNextEvent,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PendingStatus {
Ready,
Incomplete,
Disconnected,
}
pub trait Remote: Resource + Sized {
fn connect_with(
config: TransportConnect,
remote_addr: RemoteAddr,
) -> io::Result<ConnectionInfo<Self>>;
fn receive(&self, process_data: impl FnMut(&[u8])) -> ReadStatus;
fn send(&self, data: &[u8]) -> SendStatus;
fn pending(&self, readiness: Readiness) -> PendingStatus;
fn ready_to_write(&self) -> bool {
true
}
}
pub enum AcceptedType<'a, R> {
Remote(SocketAddr, R),
Data(SocketAddr, &'a [u8]),
}
pub trait Local: Resource + Sized {
type Remote: Remote;
fn listen_with(config: TransportListen, 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")
}
}