1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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>
{
    /// convert internal [`StateCollector`](crate::StateCollector) to special
    /// State
    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,
        }
    }
    /// convenient function for [`ServerPrepare::convert_state::<()>`](axum_starter::ServerPrepare::convert_state)
    pub fn no_state(self) -> ServerPrepare<C, FutEffect, Log, StateReady<()>, Graceful, Decorator> {
        self.convert_state::<()>()
    }
}