#[derive(Debug)] pub struct ChessPosition { rank: i32, file: i32, } #[derive(Debug)] pub struct Queen { pos: ChessPosition, } fn in_range(n: T, min: T, max: T) -> bool { min <= n && n < max } impl ChessPosition { pub fn new(rank: i32, file: i32) -> Option { if in_range(rank, 0, 8) && in_range(file, 0, 8) { Some(ChessPosition { rank, file }) } else { None } } } impl Queen { pub fn new(pos: ChessPosition) -> Self { Queen { pos } } pub fn can_attack(&self, other: &Queen) -> bool { self.pos.file == other.pos.file || self.pos.rank == other.pos.rank || (self.pos.rank - other.pos.rank).abs() == (self.pos.file - other.pos.file).abs() } }