use crate::connections::Connection;
use once_cell::sync::OnceCell;
use tokio::sync::{mpsc, oneshot};
use std::{io, net::SocketAddr};
mod disconnect;
mod handshaking;
mod reading;
mod writing;
pub use disconnect::Disconnect;
pub use handshaking::Handshaking;
pub use reading::Reading;
pub use writing::Writing;
#[derive(Default)]
pub(crate) struct Protocols {
pub(crate) handshake_handler: OnceCell<ProtocolHandler<ReturnableConnection>>,
pub(crate) reading_handler: OnceCell<ProtocolHandler<ReturnableConnection>>,
pub(crate) writing_handler: OnceCell<ProtocolHandler<ReturnableConnection>>,
pub(crate) disconnect_handler: OnceCell<ProtocolHandler<(SocketAddr, oneshot::Sender<()>)>>,
}
pub struct ProtocolHandler<T: Send> {
sender: mpsc::Sender<T>,
}
impl<T: Send> ProtocolHandler<T> {
pub async fn send(&self, item: T) {
if self.sender.send(item).await.is_err() {
unreachable!(); }
}
}
impl<T: Send> From<mpsc::Sender<T>> for ProtocolHandler<T> {
fn from(sender: mpsc::Sender<T>) -> Self {
Self { sender }
}
}
pub type ReturnableConnection = (Connection, oneshot::Sender<io::Result<Connection>>);