diff --git a/Cargo.lock b/Cargo.lock index 6b992d6..7aa6033 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -499,24 +499,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "bot" -version = "0.1.0" -dependencies = [ - "board-game", - "burn", - "burn-rl", - "confy", - "env_logger 0.10.2", - "internal-iterator", - "log", - "pretty_assertions", - "rand 0.9.2", - "serde", - "serde_json", - "store", -] - [[package]] name = "bstr" version = "1.12.1" @@ -1240,22 +1222,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "client_cli" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode 1.3.3", - "bot", - "env_logger 0.11.8", - "itertools 0.13.0", - "log", - "pico-args", - "pretty_assertions", - "renet", - "store", -] - [[package]] name = "cmake" version = "0.1.57" @@ -5851,19 +5817,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "store" -version = "0.1.0" -dependencies = [ - "base64 0.21.7", - "log", - "merge", - "pyo3", - "rand 0.8.5", - "serde", - "transpose", -] - [[package]] name = "strength_reduce" version = "0.2.4" @@ -6626,6 +6579,53 @@ dependencies = [ "strength_reduce", ] +[[package]] +name = "trictrac-bot" +version = "0.1.0" +dependencies = [ + "board-game", + "burn", + "burn-rl", + "confy", + "env_logger 0.10.2", + "internal-iterator", + "log", + "pretty_assertions", + "rand 0.9.2", + "serde", + "serde_json", + "trictrac-store", +] + +[[package]] +name = "trictrac-client_cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "env_logger 0.11.8", + "itertools 0.13.0", + "log", + "pico-args", + "pretty_assertions", + "renet", + "trictrac-bot", + "trictrac-store", +] + +[[package]] +name = "trictrac-store" +version = "0.1.0" +dependencies = [ + "base64 0.21.7", + "log", + "merge", + "pyo3", + "rand 0.8.5", + "serde", + "transpose", +] + [[package]] name = "try-lock" version = "0.2.5" diff --git a/bot/Cargo.toml b/bot/Cargo.toml index 58193fc..de957df 100644 --- a/bot/Cargo.toml +++ b/bot/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "bot" +name = "trictrac-bot" version = "0.1.0" edition = "2021" @@ -13,7 +13,7 @@ path = "src/burnrl/main.rs" pretty_assertions = "1.4.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -store = { path = "../store" } +trictrac-store = { path = "../store" } rand = "0.9" env_logger = "0.10" burn = { version = "0.20", features = ["ndarray", "autodiff"] } diff --git a/bot/python/test.py b/bot/python/test.py index 7b13b7d..d933963 100644 --- a/bot/python/test.py +++ b/bot/python/test.py @@ -1,4 +1,4 @@ -import store +import trictrac_store -game = store.TricTrac() -print(game.get_state_dict()) +game = trictrac_store.TricTrac() +print(game.get_active_player_id()) diff --git a/bot/src/burnrl/environment.rs b/bot/src/burnrl/environment.rs index c8e0f53..6114722 100644 --- a/bot/src/burnrl/environment.rs +++ b/bot/src/burnrl/environment.rs @@ -4,7 +4,7 @@ use crate::training_common; use burn::{prelude::Backend, tensor::Tensor}; use burn_rl::base::{Action, Environment, Snapshot, State}; use rand::{rng, Rng}; -use store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; +use trictrac_store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; const ERROR_REWARD: f32 = -1.0012121; const REWARD_VALID_MOVE: f32 = 1.0012121; @@ -292,7 +292,7 @@ impl TrictracEnvironment { let dice_values = (rng.random_range(1..=6), rng.random_range(1..=6)); let dice_event = GameEvent::RollResult { player_id: self.active_player_id, - dice: store::Dice { + dice: trictrac_store::Dice { values: dice_values, }, }; @@ -340,7 +340,7 @@ impl TrictracEnvironment { // Exécuter l'action selon le turn_stage let mut calculate_points = false; - let opponent_color = store::Color::Black; + let opponent_color = trictrac_store::Color::Black; let event = match self.game.turn_stage { TurnStage::RollDice => GameEvent::Roll { player_id: self.opponent_id, @@ -351,7 +351,7 @@ impl TrictracEnvironment { calculate_points = true; GameEvent::RollResult { player_id: self.opponent_id, - dice: store::Dice { + dice: trictrac_store::Dice { values: dice_values, }, } @@ -371,7 +371,7 @@ impl TrictracEnvironment { } } TurnStage::MarkAdvPoints => { - let opponent_color = store::Color::Black; + let opponent_color = trictrac_store::Color::Black; let dice_roll_count = self .game .players diff --git a/bot/src/burnrl/environment_valid.rs b/bot/src/burnrl/environment_valid.rs index 6e83278..5a837e6 100644 --- a/bot/src/burnrl/environment_valid.rs +++ b/bot/src/burnrl/environment_valid.rs @@ -2,7 +2,7 @@ use crate::training_common; use burn::{prelude::Backend, tensor::Tensor}; use burn_rl::base::{Action, Environment, Snapshot, State}; use rand::{rng, Rng}; -use store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; +use trictrac_store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; const ERROR_REWARD: f32 = -1.0012121; const REWARD_RATIO: f32 = 0.1; @@ -262,7 +262,7 @@ impl TrictracEnvironment { let dice_values = (rng.random_range(1..=6), rng.random_range(1..=6)); let dice_event = GameEvent::RollResult { player_id: self.active_player_id, - dice: store::Dice { + dice: trictrac_store::Dice { values: dice_values, }, }; @@ -310,7 +310,7 @@ impl TrictracEnvironment { // Exécuter l'action selon le turn_stage let mut calculate_points = false; - let opponent_color = store::Color::Black; + let opponent_color = trictrac_store::Color::Black; let event = match self.game.turn_stage { TurnStage::RollDice => GameEvent::Roll { player_id: self.opponent_id, @@ -321,7 +321,7 @@ impl TrictracEnvironment { calculate_points = true; GameEvent::RollResult { player_id: self.opponent_id, - dice: store::Dice { + dice: trictrac_store::Dice { values: dice_values, }, } diff --git a/bot/src/burnrl/main.rs b/bot/src/burnrl/main.rs index 5230ec0..9275f59 100644 --- a/bot/src/burnrl/main.rs +++ b/bot/src/burnrl/main.rs @@ -1,7 +1,7 @@ -use bot::burnrl::algos::{dqn, dqn_valid, ppo, ppo_valid, sac, sac_valid}; -use bot::burnrl::environment::TrictracEnvironment; -use bot::burnrl::environment_valid::TrictracEnvironment as TrictracEnvironmentValid; -use bot::burnrl::utils::{demo_model, Config}; +use trictrac_bot::burnrl::algos::{dqn, dqn_valid, ppo, ppo_valid, sac, sac_valid}; +use trictrac_bot::burnrl::environment::TrictracEnvironment; +use trictrac_bot::burnrl::environment_valid::TrictracEnvironment as TrictracEnvironmentValid; +use trictrac_bot::burnrl::utils::{demo_model, Config}; use burn::backend::{Autodiff, NdArray}; use burn_rl::base::ElemType; use std::env; diff --git a/bot/src/lib.rs b/bot/src/lib.rs index 0fc6fdf..5831d67 100644 --- a/bot/src/lib.rs +++ b/bot/src/lib.rs @@ -4,7 +4,7 @@ pub mod training_common; pub mod trictrac_board; use log::debug; -use store::{CheckerMove, Color, GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; +use trictrac_store::{CheckerMove, Color, GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage}; pub use strategy::default::DefaultStrategy; pub use strategy::dqnburn::DqnBurnStrategy; pub use strategy::erroneous_moves::ErroneousStrategy; @@ -144,7 +144,7 @@ impl Bot { #[cfg(test)] mod tests { use super::*; - use store::{Dice, Stage}; + use trictrac_store::{Dice, Stage}; #[test] fn test_new() { diff --git a/bot/src/strategy/default.rs b/bot/src/strategy/default.rs index 628ce83..f8b191d 100644 --- a/bot/src/strategy/default.rs +++ b/bot/src/strategy/default.rs @@ -1,5 +1,5 @@ use crate::{BotStrategy, CheckerMove, Color, GameState, PlayerId}; -use store::MoveRules; +use trictrac_store::MoveRules; #[derive(Debug)] pub struct DefaultStrategy { diff --git a/bot/src/strategy/dqnburn.rs b/bot/src/strategy/dqnburn.rs index 2fea85e..a4c05c7 100644 --- a/bot/src/strategy/dqnburn.rs +++ b/bot/src/strategy/dqnburn.rs @@ -4,7 +4,7 @@ use burn_rl::base::{ElemType, Model, State}; use crate::{BotStrategy, CheckerMove, Color, GameState, PlayerId}; use log::info; -use store::MoveRules; +use trictrac_store::MoveRules; use crate::burnrl::algos::dqn; use crate::burnrl::environment; @@ -152,7 +152,7 @@ impl BotStrategy for DqnBurnStrategy { to1 = if fto1 < 0 { 0 } else { fto1 as usize }; } - let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default(); + let checker_move1 = trictrac_store::CheckerMove::new(from1, to1).unwrap_or_default(); let mut tmp_board = self.game.board.clone(); let move_res = tmp_board.move_checker(&self.color, checker_move1); diff --git a/bot/src/strategy/random.rs b/bot/src/strategy/random.rs index 76e59a4..08d851d 100644 --- a/bot/src/strategy/random.rs +++ b/bot/src/strategy/random.rs @@ -1,6 +1,6 @@ use crate::{BotStrategy, CheckerMove, Color, GameState, PlayerId}; use rand::{prelude::IndexedRandom, rng}; -use store::MoveRules; +use trictrac_store::MoveRules; #[derive(Debug)] pub struct RandomStrategy { diff --git a/bot/src/strategy/stable_baselines3.rs b/bot/src/strategy/stable_baselines3.rs index 541bfbb..78aa583 100644 --- a/bot/src/strategy/stable_baselines3.rs +++ b/bot/src/strategy/stable_baselines3.rs @@ -5,7 +5,7 @@ use std::io::Read; use std::io::Write; use std::path::Path; use std::process::Command; -use store::MoveRules; +use trictrac_store::MoveRules; #[derive(Debug)] pub struct StableBaselines3Strategy { @@ -79,12 +79,12 @@ impl StableBaselines3Strategy { // Convertir l'étape du tour en entier let turn_stage = match self.game.turn_stage { - store::TurnStage::RollDice => 0, - store::TurnStage::RollWaiting => 1, - store::TurnStage::MarkPoints => 2, - store::TurnStage::HoldOrGoChoice => 3, - store::TurnStage::Move => 4, - store::TurnStage::MarkAdvPoints => 5, + trictrac_store::TurnStage::RollDice => 0, + trictrac_store::TurnStage::RollWaiting => 1, + trictrac_store::TurnStage::MarkPoints => 2, + trictrac_store::TurnStage::HoldOrGoChoice => 3, + trictrac_store::TurnStage::Move => 4, + trictrac_store::TurnStage::MarkAdvPoints => 5, }; // Récupérer les points et trous des joueurs diff --git a/bot/src/training_common.rs b/bot/src/training_common.rs index e677402..2b6bc04 100644 --- a/bot/src/training_common.rs +++ b/bot/src/training_common.rs @@ -4,7 +4,7 @@ use std::cmp::{max, min}; use std::fmt::{Debug, Display, Formatter}; use serde::{Deserialize, Serialize}; -use store::{CheckerMove, GameEvent, GameState}; +use trictrac_store::{CheckerMove, GameEvent, GameState}; // 1 (Roll) + 1 (Go) + 512 (mouvements possibles) // avec 512 = 2 (choix du dé) * 16 * 16 (choix de la dame 0-15 pour chaque from) @@ -94,13 +94,13 @@ impl TrictracAction { (state.dice.values.1, state.dice.values.0) }; - let color = &store::Color::White; + let color = &trictrac_store::Color::White; let from1 = state .board .get_checker_field(color, *checker1 as u8) .unwrap_or(0); let mut to1 = from1 + dice1 as usize; - let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default(); + let checker_move1 = trictrac_store::CheckerMove::new(from1, to1).unwrap_or_default(); let mut tmp_board = state.board.clone(); let move_result = tmp_board.move_checker(color, checker_move1); @@ -120,8 +120,8 @@ impl TrictracAction { to2 -= 1; } - let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default(); - let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default(); + let checker_move1 = trictrac_store::CheckerMove::new(from1, to1).unwrap_or_default(); + let checker_move2 = trictrac_store::CheckerMove::new(from2, to2).unwrap_or_default(); Some(GameEvent::Move { player_id: state.active_player_id, @@ -179,8 +179,8 @@ impl TrictracAction { // from2, // } => { // // Effectuer un mouvement - // let checker_move1 = store::CheckerMove::new(move1.0, move1.1).unwrap_or_default(); - // let checker_move2 = store::CheckerMove::new(move2.0, move2.1).unwrap_or_default(); + // let checker_move1 = trictrac_store::CheckerMove::new(move1.0, move1.1).unwrap_or_default(); + // let checker_move2 = trictrac_store::CheckerMove::new(move2.0, move2.1).unwrap_or_default(); // // Some(GameEvent::Move { // player_id: self.agent_player_id, @@ -193,7 +193,7 @@ impl TrictracAction { /// Obtient les actions valides pour l'état de jeu actuel pub fn get_valid_actions(game_state: &crate::GameState) -> Vec { - use store::TurnStage; + use trictrac_store::TurnStage; let mut valid_actions = Vec::new(); @@ -216,11 +216,11 @@ pub fn get_valid_actions(game_state: &crate::GameState) -> Vec { valid_actions.push(TrictracAction::Go); // Ajoute aussi les mouvements possibles - let rules = store::MoveRules::new(&color, &game_state.board, game_state.dice); + let rules = trictrac_store::MoveRules::new(&color, &game_state.board, game_state.dice); let possible_moves = rules.get_possible_moves_sequences(true, vec![]); // Modififier checker_moves_to_trictrac_action si on doit gérer Black - assert_eq!(color, store::Color::White); + assert_eq!(color, trictrac_store::Color::White); for (move1, move2) in possible_moves { valid_actions.push(checker_moves_to_trictrac_action( &move1, &move2, &color, game_state, @@ -228,7 +228,7 @@ pub fn get_valid_actions(game_state: &crate::GameState) -> Vec { } } TurnStage::Move => { - let rules = store::MoveRules::new(&color, &game_state.board, game_state.dice); + let rules = trictrac_store::MoveRules::new(&color, &game_state.board, game_state.dice); let mut possible_moves = rules.get_possible_moves_sequences(true, vec![]); if possible_moves.is_empty() { // Empty move @@ -236,7 +236,7 @@ pub fn get_valid_actions(game_state: &crate::GameState) -> Vec { } // Modififier checker_moves_to_trictrac_action si on doit gérer Black - assert_eq!(color, store::Color::White); + assert_eq!(color, trictrac_store::Color::White); for (move1, move2) in possible_moves { valid_actions.push(checker_moves_to_trictrac_action( &move1, &move2, &color, game_state, @@ -256,7 +256,7 @@ pub fn get_valid_actions(game_state: &crate::GameState) -> Vec { fn checker_moves_to_trictrac_action( move1: &CheckerMove, move2: &CheckerMove, - color: &store::Color, + color: &trictrac_store::Color, state: &crate::GameState, ) -> TrictracAction { let to1 = move1.get_to(); diff --git a/bot/src/trictrac_board.rs b/bot/src/trictrac_board.rs index 5e9fc7f..de88596 100644 --- a/bot/src/trictrac_board.rs +++ b/bot/src/trictrac_board.rs @@ -8,7 +8,7 @@ use internal_iterator::InternalIterator; use std::fmt; use std::hash::Hash; use std::ops::ControlFlow; -use store::Color; +use trictrac_store::Color; #[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct TrictracBoard(crate::GameState); diff --git a/client_cli/Cargo.toml b/client_cli/Cargo.toml index 6c1d4e1..e48a249 100644 --- a/client_cli/Cargo.toml +++ b/client_cli/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "client_cli" +name = "trictrac-client_cli" version = "0.1.0" edition = "2021" @@ -11,8 +11,8 @@ bincode = "1.3.3" pico-args = "0.5.0" pretty_assertions = "1.4.0" renet = "0.0.13" -store = { path = "../store" } -bot = { path = "../bot" } +trictrac-store = { path = "../store" } +trictrac-bot = { path = "../bot" } itertools = "0.13.0" env_logger = "0.11.6" log = "0.4.20" diff --git a/client_cli/src/app.rs b/client_cli/src/app.rs index 0c297dc..b803efe 100644 --- a/client_cli/src/app.rs +++ b/client_cli/src/app.rs @@ -1,11 +1,11 @@ -use bot::{ +use trictrac_bot::{ BotStrategy, DefaultStrategy, DqnBurnStrategy, ErroneousStrategy, RandomStrategy, StableBaselines3Strategy, }; use itertools::Itertools; use crate::game_runner::GameRunner; -use store::{CheckerMove, GameEvent, GameState, Stage, TurnStage}; +use trictrac_store::{CheckerMove, GameEvent, GameState, Stage, TurnStage}; #[derive(Debug, Default)] pub struct AppArgs { diff --git a/client_cli/src/game_runner.rs b/client_cli/src/game_runner.rs index b595c91..75c78b3 100644 --- a/client_cli/src/game_runner.rs +++ b/client_cli/src/game_runner.rs @@ -1,6 +1,6 @@ -use bot::{Bot, BotStrategy}; +use trictrac_bot::{Bot, BotStrategy}; use log::{debug, error}; -use store::{CheckerMove, DiceRoller, GameEvent, GameState, PlayerId, TurnStage}; +use trictrac_store::{CheckerMove, DiceRoller, GameEvent, GameState, PlayerId, TurnStage}; // Application Game #[derive(Debug, Default)] @@ -117,8 +117,8 @@ impl GameRunner { } if let Some(winner) = self.state.determine_winner() { - next_event = Some(store::GameEvent::EndGame { - reason: store::EndGameReason::PlayerWon { winner }, + next_event = Some(trictrac_store::GameEvent::EndGame { + reason: trictrac_store::EndGameReason::PlayerWon { winner }, }); } diff --git a/doc/python.md b/doc/python.md index 65b0239..60fa378 100644 --- a/doc/python.md +++ b/doc/python.md @@ -16,8 +16,8 @@ Pour vérifier l'accès à la lib : lancer le shell interactif `python` ```python Python 3.13.11 (main, Dec 5 2025, 16:06:33) [GCC 15.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. ->>> import store ->>> game = store.TricTrac() +>>> import trictrac_store +>>> game = trictrac_store.TricTrac() >>> game.get_active_player_id() 1 ``` diff --git a/store/Cargo.toml b/store/Cargo.toml index 0517553..3e35b0c 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "store" +name = "trictrac-store" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] -name = "store" +name = "trictrac_store" # "cdylib" is necessary to produce a shared library for Python to import from. # Only "rlib" is needed for other Rust crates to use this library crate-type = ["cdylib", "rlib"] diff --git a/store/pyproject.toml b/store/pyproject.toml index 8fe5762..f50d478 100644 --- a/store/pyproject.toml +++ b/store/pyproject.toml @@ -6,4 +6,3 @@ build-backend = "maturin" # "extension-module" tells pyo3 we want to build an extension module (skips linking against libpython.so) features = ["pyo3/extension-module"] # python-source = "python" -# module-name = "trictrac.game" diff --git a/store/src/pyengine.rs b/store/src/pyengine.rs index b436baa..dad3454 100644 --- a/store/src/pyengine.rs +++ b/store/src/pyengine.rs @@ -36,73 +36,52 @@ impl TricTrac { } } - /// Obtenir l'état du jeu sous forme de dictionnaire - fn get_state_dict<'py>(&self, py: Python<'py>) -> PyResult> { - let dict = PyDict::new(py); - dict.set_item("stage", format!("{:?}", self.game_state.stage))?; - dict.set_item("turn_stage", format!("{:?}", self.game_state.turn_stage))?; - dict.set_item("active_player_id", self.game_state.active_player_id)?; - - // Board - let board_list = self.game_state.board.to_vec(); // returns Vec - dict.set_item("board", board_list)?; - - // Dice - dict.set_item("dice", (self.game_state.dice.values.0, self.game_state.dice.values.1))?; - - // Players - let players_dict = PyDict::new(py); - for (id, player) in &self.game_state.players { - let p_dict = PyDict::new(py); - p_dict.set_item("color", format!("{:?}", player.color))?; - p_dict.set_item("holes", player.holes)?; - p_dict.set_item("points", player.points)?; - p_dict.set_item("can_bredouille", player.can_bredouille)?; - p_dict.set_item("dice_roll_count", player.dice_roll_count)?; - players_dict.set_item(id, p_dict)?; - } - dict.set_item("players", players_dict)?; - - Ok(dict) - } - /// Lance les dés ou utilise la séquence prédéfinie fn roll_dice(&mut self) -> PyResult<(u8, u8)> { let player_id = self.game_state.active_player_id; if self.game_state.turn_stage != TurnStage::RollDice { - return Err(pyo3::exceptions::PyRuntimeError::new_err("Not in RollDice stage")); + return Err(pyo3::exceptions::PyRuntimeError::new_err( + "Not in RollDice stage", + )); } - + self.game_state.consume(&GameEvent::Roll { player_id }); - + let dice = if self.current_dice_index < self.dice_roll_sequence.len() { - let vals = self.dice_roll_sequence[self.current_dice_index]; - self.current_dice_index += 1; - Dice { values: vals } + let vals = self.dice_roll_sequence[self.current_dice_index]; + self.current_dice_index += 1; + Dice { values: vals } } else { - DiceRoller::default().roll() + DiceRoller::default().roll() }; - - self.game_state.consume(&GameEvent::RollResult { player_id, dice }); - + + self.game_state + .consume(&GameEvent::RollResult { player_id, dice }); + Ok(dice.values) } /// Applique un mouvement (deux déplacements de dames) fn apply_move(&mut self, from1: usize, to1: usize, from2: usize, to2: usize) -> PyResult<()> { let player_id = self.game_state.active_player_id; - - let m1 = CheckerMove::new(from1, to1).map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?; - let m2 = CheckerMove::new(from2, to2).map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?; - + + let m1 = CheckerMove::new(from1, to1) + .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?; + let m2 = CheckerMove::new(from2, to2) + .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?; + let moves = (m1, m2); - - if !self.game_state.validate(&GameEvent::Move { player_id, moves }) { - return Err(pyo3::exceptions::PyValueError::new_err("Invalid move")); + + if !self + .game_state + .validate(&GameEvent::Move { player_id, moves }) + { + return Err(pyo3::exceptions::PyValueError::new_err("Invalid move")); } - - self.game_state.consume(&GameEvent::Move { player_id, moves }); + + self.game_state + .consume(&GameEvent::Move { player_id, moves }); Ok(()) } @@ -223,7 +202,7 @@ impl TricTrac { /// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to /// import the module. #[pymodule] -fn store(m: &Bound<'_, PyModule>) -> PyResult<()> { +fn trictrac_store(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; Ok(())