use std::{io, sync::Arc};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum WireFormat {
Ascii = 255,
}
pub trait ClusterSessionFace: Send + Sync {
fn session_id(&self) -> i64 {
0
}
}
pub trait MessageConsumerFace: Send + Sync {
fn dispose(&self);
fn cluster_session(&self) -> Option<Arc<dyn ClusterSessionFace>> {
None
}
fn attach_server(&self, server: Arc<dyn ServerEnumerate>);
}
pub trait SessionProviderFace: Send + Sync {
fn get_session(
&self,
wire_format: WireFormat,
network_sender_id: u64,
) -> Option<Arc<dyn MessageConsumerFace>>;
}
pub trait ServerEnumerate: Send + Sync {
fn active_consumers(&self) -> Vec<Arc<dyn MessageConsumerFace>>;
fn active_cluster_sessions(&self) -> Vec<Arc<dyn ClusterSessionFace>>;
}
pub trait GarnetServer: Send + Sync {
fn register(
&self,
wire_format: WireFormat,
backend_provider: Arc<dyn SessionProviderFace>,
) -> Result<(), ServerError>;
fn unregister(&self, wire_format: WireFormat) -> Option<Arc<dyn SessionProviderFace>>;
fn get_session_providers(&self) -> Vec<(WireFormat, Arc<dyn SessionProviderFace>)>;
fn add_session(
&self,
wire_format: WireFormat,
backend_provider: &dyn SessionProviderFace,
network_sender_id: u64,
) -> Option<Arc<dyn MessageConsumerFace>>;
fn start(&self) -> io::Result<()>;
fn close(&self);
fn dispose(&self);
}
#[derive(Debug, thiserror::Error)]
pub enum ServerError {
#[error("Wire format {0:?} already registered")]
WireFormatAlreadyRegistered(WireFormat),
}