From 640a61fe4853cc871252e682d7486b6558a995c6 Mon Sep 17 00:00:00 2001 From: szymon Date: Wed, 12 Aug 2026 18:45:44 +0200 Subject: [PATCH] chore: add DeltaPosition --- nix/shell.nix | 2 ++ src/logic/board.rs | 6 +--- src/logic/mod.rs | 1 + src/logic/utils.rs | 75 +++++++++++++++++++++++++++++++++++----------- 4 files changed, 62 insertions(+), 22 deletions(-) diff --git a/nix/shell.nix b/nix/shell.nix index 2b1722f..cb5683e 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -5,6 +5,8 @@ rustfmt ]; + RUST_LOG = "debug"; + inputsFrom = [ (config.packages.default) ]; diff --git a/src/logic/board.rs b/src/logic/board.rs index f667185..fd44e2e 100644 --- a/src/logic/board.rs +++ b/src/logic/board.rs @@ -1,8 +1,4 @@ -use crate::logic::{ - pawn::{self, Pawn, PawnState}, - player::Player, - utils::{Field, Position}, -}; +use crate::logic::{field::Field, pawn::Pawn, player::Player, utils::Position}; use std::ops::{Index, IndexMut}; use log::{debug, info, warn}; diff --git a/src/logic/mod.rs b/src/logic/mod.rs index 2fe4b6d..81d0c3b 100644 --- a/src/logic/mod.rs +++ b/src/logic/mod.rs @@ -1,4 +1,5 @@ mod board; +mod field; mod pawn; mod player; mod utils; diff --git a/src/logic/utils.rs b/src/logic/utils.rs index 69490ed..590d4a2 100644 --- a/src/logic/utils.rs +++ b/src/logic/utils.rs @@ -1,6 +1,6 @@ use core::fmt; -use crate::logic::pawn::Pawn; +use log::debug; #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct Position { @@ -14,22 +14,63 @@ impl fmt::Display for Position { } } -#[derive(Debug, PartialEq, Eq)] -pub struct Field { - pub position: Position, - pub pawn: Option, -} +impl Position { + pub fn checked_add(&self, delta: &DeltaPosition) -> Option { + let new_row = self.row.checked_add_signed(delta.row as isize)?; + let new_column = self.column.checked_add_signed(delta.column as isize)?; + debug!("Adding row: {} + {} = {}", self.row, delta.row, new_row); + debug!( + "Adding column: {} + {} = {}", + self.column, delta.column, new_column + ); -impl fmt::Display for Field { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(pawn) = &self.pawn { - write!( - f, - "Field at pos: {}. Pawn here owned by: {}", - self.position, pawn.owner - ) - } else { - write!(f, "Field at pos: {}. No pawn here.", self.position) - } + Some(Position { + row: new_row, + column: new_column, + }) + } +} + +/// Vector for moving `Position` +pub struct DeltaPosition { + pub row: i8, + pub column: i8, +} + +#[cfg(test)] +mod tests { + use super::*; + + fn init_logger() { + let _ = env_logger::builder().is_test(true).try_init(); + } + + #[test] + fn test_adding_positions() { + init_logger(); + + let pos1: Position = Position { row: 1, column: 1 }; + let delta_ok: DeltaPosition = DeltaPosition { row: 1, column: 1 }; + + let result1: Option = pos1.checked_add(&delta_ok); + assert!(result1.is_some()); + assert_eq!(result1.unwrap(), Position { row: 2, column: 2 }); + + let delta_minus_ok: DeltaPosition = DeltaPosition { + row: -1, + column: -1, + }; + + let result1: Option = pos1.checked_add(&delta_minus_ok); + assert!(result1.is_some()); + assert_eq!(result1.unwrap(), Position { row: 0, column: 0 }); + + let delta_not_ok: DeltaPosition = DeltaPosition { + row: -10, + column: -10, + }; + + let result3: Option = pos1.checked_add(&delta_not_ok); + assert!(result3.is_none()); } }