use crate::stream::ConnectionInfoProvider;
use std::fmt::{Debug, Display};
use std::io;
use std::net::SocketAddr;
use std::time::Duration;
pub trait Endpoint: ConnectionInfoProvider {
type Target;
fn create_target(&mut self, addr: SocketAddr) -> io::Result<Option<Self::Target>>;
fn can_recreate(&mut self, _reason: &DisconnectReason) -> bool {
true
}
fn can_auto_disconnect(&mut self) -> bool {
true
}
}
pub trait Context {}
pub trait EndpointWithContext<C>: ConnectionInfoProvider {
type Target;
fn create_target(&mut self, addr: SocketAddr, context: &mut C) -> io::Result<Option<Self::Target>>;
fn can_recreate(&mut self, _reason: &DisconnectReason, _context: &mut C) -> bool {
true
}
fn can_auto_disconnect(&mut self, _context: &mut C) -> bool {
true
}
}
#[derive(Debug)]
pub enum DisconnectReason {
AutoDisconnect(Duration),
IO(io::Error),
}
impl Display for DisconnectReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DisconnectReason::AutoDisconnect(ttl) => {
write!(f, "auto-disconnect after ")?;
ttl.fmt(f)
}
DisconnectReason::IO(err) => {
write!(f, "{err}")
}
}
}
}
impl DisconnectReason {
pub(crate) fn auto_disconnect(ttl: Duration) -> DisconnectReason {
DisconnectReason::AutoDisconnect(ttl)
}
pub(crate) fn other(err: io::Error) -> DisconnectReason {
DisconnectReason::IO(err)
}
}