use std::{net::SocketAddr, sync::Arc};
use crate::sync::*;
use crate::types::status_code::StatusCode;
use crate::server::session::SessionManager;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum TransportState {
New,
WaitingHello,
ProcessMessages,
Finished(StatusCode),
}
pub trait Transport {
fn state(&self) -> TransportState;
fn has_received_hello(&self) -> bool {
!matches!(
self.state(),
TransportState::New | TransportState::WaitingHello
)
}
fn finish(&mut self, status_code: StatusCode);
fn is_finished(&self) -> bool {
matches!(self.state(), TransportState::Finished(_))
}
fn client_address(&self) -> Option<SocketAddr>;
fn session_manager(&self) -> Arc<RwLock<SessionManager>>;
}