public Result TryMakeMove(MoveCommand move) { var error = Rules.Select(r => r.Validate(Board, move)).FirstOrDefault(r => !r.IsValid); if (error is object) { return(Result.Error(error.Message)); } var record = Board.ApplyMoveCommand(move); History.Add(record); if (CurrentPlayer == Color.White) { CurrentPlayer = Color.Black; } else { CurrentPlayer = Color.White; } return(Result.Ok); }