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
47
48
49
50
51
52
53
54
55
use std::error::Error;
use serde_json::Value;
use serde::Serialize;
use serde::de::DeserializeOwned;

use state::*;
use bot::*;

pub trait UserFlow<T: Default + Clone + Serialize + DeserializeOwned> {
    fn initial_state(&self, seed: Option<u128>) -> T;

    fn list_moves(&self) -> Vec<&'static str> {
        vec![]
    }

    fn end_turn_if(&self, _: &UserState<T>) -> bool {
        false
    }

    fn end_game_if(&self, _: &UserState<T>) -> Option<(Option<Score>, Value)> {
        None
    }

    fn on_turn_begin(&self, state: &mut UserState<T>) -> Result<(), Box<Error>> {
        Ok(())
    }

    fn on_turn_end(&self, state: &mut UserState<T>) -> Result<(), Box<Error>> {
        Ok(())
    }

    fn on_move(&self, state: &mut UserState<T>, _: &Move) -> Result<(), Box<Error>> {
        Ok(())
    }

    fn get_current_players(&self, _: &UserState<T>) -> Option<Vec<u16>> {
        None
    }

    fn allowed_moves(&self, _: &UserState<T>, _: u16) -> Option<Vec<&str>> {
        None
    }

    fn optimistic_update(&self, _: &UserState<T>, _: &Move) -> bool {
        true
    }

    fn player_filter(&self) -> Option<fn(&T, u16) -> T> {
        None
    }

    fn make_move(&self,
                state: &mut UserState<T>,
                game_move: &Move) -> Result<(), Box<Error>>;
}