use crate::*;
pub const DEFAULT_HOST: &str = "0.0.0.0";
pub const DEFAULT_PORT: u16 = 60000;
pub const DEFAULT_BUFFER_SIZE: usize = 524288;
pub const DEFAULT_NODELAY: Option<bool> = None;
pub const DEFAULT_TTL: Option<u32> = None;
impl Default for ServerConfigData {
#[inline(always)]
fn default() -> Self {
Self {
host: DEFAULT_HOST.to_owned(),
port: DEFAULT_PORT,
buffer_size: DEFAULT_BUFFER_SIZE,
nodelay: DEFAULT_NODELAY,
ttl: DEFAULT_TTL,
}
}
}
impl Default for ServerConfig {
#[inline(always)]
fn default() -> Self {
Self(arc_rwlock(ServerConfigData::default()))
}
}
impl PartialEq for ServerConfig {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
if Arc::ptr_eq(&self.0, &other.0) {
return true;
}
if let (Ok(s), Ok(o)) = (self.0.try_read(), other.0.try_read()) {
*s == *o
} else {
false
}
}
}
impl Eq for ServerConfig {}
impl From<ServerConfigData> for ServerConfig {
#[inline(always)]
fn from(data: ServerConfigData) -> Self {
Self(arc_rwlock(data))
}
}
impl ServerConfig {
pub async fn new() -> Self {
Self::default()
}
async fn read(&self) -> RwLockReadGuard<'_, ServerConfigData> {
self.0.read().await
}
async fn write(&self) -> RwLockWriteGuard<'_, ServerConfigData> {
self.0.write().await
}
pub(crate) async fn get_data(&self) -> ServerConfigData {
self.read().await.clone()
}
pub async fn host<H>(&self, host: H) -> &Self
where
H: AsRef<str>,
{
self.write().await.host = host.as_ref().to_owned();
self
}
pub async fn port(&self, port: u16) -> &Self {
self.write().await.port = port;
self
}
pub async fn buffer_size(&self, size: usize) -> &Self {
self.write().await.buffer_size = size;
self
}
pub async fn nodelay(&self, nodelay: bool) -> &Self {
self.write().await.nodelay = Some(nodelay);
self
}
pub async fn enable_nodelay(&self) -> &Self {
self.nodelay(true).await
}
pub async fn disable_nodelay(&self) -> &Self {
self.nodelay(false).await
}
pub async fn ttl(&self, ttl: u32) -> &Self {
self.write().await.ttl = Some(ttl);
self
}
}
impl ServerConfigData {
pub fn get_host(&self) -> &String {
&self.host
}
pub fn get_port(&self) -> u16 {
self.port
}
pub fn get_buffer_size(&self) -> usize {
self.buffer_size
}
pub fn get_nodelay(&self) -> Option<bool> {
self.nodelay
}
pub fn get_ttl(&self) -> Option<u32> {
self.ttl
}
pub fn set_host<H>(&mut self, host: H)
where
H: AsRef<str>,
{
self.host = host.as_ref().to_owned();
}
pub fn set_port(&mut self, port: u16) {
self.port = port;
}
pub fn set_buffer_size(&mut self, size: usize) {
self.buffer_size = size;
}
pub fn set_nodelay(&mut self, nodelay: Option<bool>) {
self.nodelay = nodelay;
}
pub fn set_ttl(&mut self, ttl: Option<u32>) {
self.ttl = ttl;
}
}