use core::marker::PhantomData;
use std::{io, time::Duration};
use bincode::error::DecodeError;
use futures::future::BoxFuture;
use super::WireframeServer;
use crate::{
app::Packet,
codec::FrameCodec,
preamble::Preamble,
serializer::Serializer,
server::{AppFactory, PreambleSuccessHandler, ServerState},
};
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,
{
#[must_use]
pub fn with_preamble<P>(self) -> WireframeServer<F, P, S, Ser, Ctx, E, Codec>
where
P: Preamble,
{
WireframeServer {
factory: self.factory,
workers: self.workers,
on_preamble_success: None,
on_preamble_failure: None,
ready_tx: self.ready_tx,
backoff_config: self.backoff_config,
preamble_timeout: self.preamble_timeout,
state: self.state,
_app: self._app,
_preamble: PhantomData,
}
}
#[must_use]
pub fn preamble_timeout(mut self, timeout: Duration) -> Self {
let normalised = timeout.max(Duration::from_millis(1));
self.preamble_timeout = Some(normalised);
self
}
builder_callback!(
on_preamble_decode_success,
on_preamble_success,
PreambleSuccessHandler<T>
);
#[must_use]
pub fn on_preamble_decode_failure<H>(mut self, handler: H) -> Self
where
H: for<'a> Fn(
&'a DecodeError,
&'a mut tokio::net::TcpStream,
) -> BoxFuture<'a, io::Result<()>>
+ Send
+ Sync
+ 'static,
{
self.on_preamble_failure = Some(std::sync::Arc::new(handler));
self
}
}