use core::marker::PhantomData;
use tokio::sync::oneshot;
use super::{AppFactory, BackoffConfig, ServerState, Unbound, WireframeServer};
use crate::{app::Packet, codec::FrameCodec, preamble::Preamble, serializer::Serializer};
macro_rules! builder_setter {
($(#[$meta:meta])* $fn:ident, $field:ident, $arg:ident: $ty:ty => $assign:expr) => {
$(#[$meta])*
#[must_use]
pub fn $fn(mut self, $arg: $ty) -> Self {
self.$field = $assign;
self
}
};
}
macro_rules! builder_callback {
($(#[$meta:meta])* $fn:ident, $field:ident, $($bound:tt)*) => {
$(#[$meta])*
#[must_use]
pub fn $fn<H>(mut self, handler: H) -> Self
where
H: $($bound)*,
{
self.$field = Some(std::sync::Arc::new(handler));
self
}
};
}
pub mod binding;
pub mod preamble;
fn default_worker_count() -> usize { super::default_worker_count() }
#[cfg(test)]
mod tests;
impl<F, Ser, Ctx, E, Codec> WireframeServer<F, (), Unbound, Ser, Ctx, E, Codec>
where
F: AppFactory<Ser, Ctx, E, Codec>,
Ser: Serializer + Send + Sync,
Ctx: Send + 'static,
E: Packet,
Codec: FrameCodec,
{
#[must_use]
pub fn new(factory: F) -> Self {
let workers = default_worker_count();
Self {
factory,
workers,
on_preamble_success: None,
on_preamble_failure: None,
ready_tx: None,
backoff_config: BackoffConfig::default(),
preamble_timeout: None,
state: Unbound,
_app: PhantomData,
_preamble: PhantomData,
}
}
}
impl<F, T, S, Ser, Ctx, E, Codec> WireframeServer<F, T, S, Ser, Ctx, E, Codec>
where
F: AppFactory<Ser, Ctx, E, Codec>,
T: Preamble,
S: ServerState,
Ser: Serializer + Send + Sync,
Ctx: Send + 'static,
E: Packet,
Codec: FrameCodec,
{
builder_setter!(
workers, workers, count: usize => count.max(1)
);
builder_setter!(
ready_signal, ready_tx, tx: oneshot::Sender<()> => Some(tx)
);
builder_setter!(
accept_backoff, backoff_config, cfg: BackoffConfig => cfg.normalized()
);
#[inline]
#[must_use]
pub const fn worker_count(&self) -> usize { self.workers }
}