Skip to main content

card_game/
context.rs

1use card_stack::priority::GetState;
2use state_validation::{StateFilter, ValidAction, ValidationError, Validator};
3
4pub struct HistoricalContext<History: ActionHistory, State> {
5    history: History,
6    state: State,
7}
8
9impl<History: ActionHistory, State> HistoricalContext<History, State> {
10    pub fn new(history: History, state: State) -> Self {
11        HistoricalContext { history, state }
12    }
13    pub fn validate<Input, Filter: StateFilter<State, Input>>(
14        self,
15        input: Input,
16    ) -> Result<ValidContext<History, State, Input, Filter>, ValidationError<State, Filter::Error>>
17    {
18        Ok(ValidContext {
19            history: self.history,
20            validator: Validator::try_new(self.state, input)?,
21        })
22    }
23}
24
25pub struct ValidContext<History: ActionHistory, State, Input, Filter: StateFilter<State, Input>> {
26    history: History,
27    validator: Validator<State, Input, Filter>,
28}
29
30impl<History: ActionHistory, State, Input, Filter: StateFilter<State, Input>>
31    ValidContext<History, State, Input, Filter>
32{
33    pub fn action<
34        Action: ValidAction<State, Input, Filter = Filter>
35            + ActionInfo<State, Filter::ValidOutput, History::History>,
36    >(
37        mut self,
38        action: Action,
39    ) -> HistoricalContext<History, Action::Output> {
40        self.history
41            .push(action.info(self.validator.state(), self.validator.valid_output()));
42        HistoricalContext::new(self.history, self.validator.execute(action))
43    }
44}
45
46pub trait ActionHistory {
47    type History;
48    fn push(&mut self, history: Self::History);
49}
50
51pub trait ActionInfo<State, Input, Info> {
52    fn info(&self, state: &State, input: &Input) -> Info;
53}