use super::{traits::*, WalkError}; use crate::board::*; #[derive(Clone, Debug)] pub struct Ferris { pub position: (i32, i32), } impl Entity for Ferris {} impl HasPosition for Ferris { fn get_position(&self) -> (i32, i32) { self.position } } impl Walker for Ferris { fn walk( &mut self, board: &Board, direction: Direction, ) -> Result { let dpos = direction.to_position::(); let new_x = self.position.0.saturating_add(dpos.0); let new_y = self.position.1.saturating_add(dpos.1); if new_x >= board.origin.0 && new_x < board.origin.0 + board.size.0 && new_y >= board.origin.1 && new_y < board.origin.1 + board.size.1 { self.position.0 = new_x; self.position.1 = new_y; Ok(self.position) } else { Err((self.position, WalkError::OutOfBoard)) } } }