use std::marker::PhantomData;
use crate::server_prepare::post_prepare::PostPrepareFn;
use crate::{prepare_behave::FromStateCollector, ServerPrepare};
pub struct StateNotReady;
pub struct StateReady<S>(Vec<PostPrepareFn<S>>);
impl<S> Default for StateReady<S> {
fn default() -> Self {
Self(vec![])
}
}
impl<S> StateReady<S> {
pub fn push(&mut self, post_prepare: PostPrepareFn<S>) {
self.0.push(post_prepare)
}
pub fn take(self) -> Vec<PostPrepareFn<S>> {
self.0
}
}
impl<C, FutEffect, Log, Graceful, Decorator>
ServerPrepare<C, FutEffect, Log, StateNotReady, Graceful, Decorator>
{
pub fn convert_state<S: FromStateCollector>(
self,
) -> ServerPrepare<C, FutEffect, Log, StateReady<S>, Graceful, Decorator> {
ServerPrepare {
prepares: self.prepares,
graceful: self.graceful,
state: StateReady::default(),
span: self.span,
_phantom: PhantomData,
}
}
pub fn no_state(self) -> ServerPrepare<C, FutEffect, Log, StateReady<()>, Graceful, Decorator> {
self.convert_state::<()>()
}
}