lib/islands/engine/guards.ex

defmodule Islands.Engine.Guards do
  @moduledoc """
  Defines guards for the Islands Engine API.
  """

  @genders [:f, :m]
  @island_types [:atoll, :dot, :l_shape, :s_shape, :square]
  @player_ids [:player1, :player2]

  defguard valid?(game_name, player_id)
           when is_binary(game_name) and player_id in @player_ids

  defguard valid?(game_name, player_name, gender, pid)
           when is_binary(game_name) and is_binary(player_name) and
                  gender in @genders and is_pid(pid)

  @doc """
  No range check on `row` or `col`: island can be dropped partly outside board.
  """
  defguard valid?(game_name, player_id, island_type, row, col)
           when is_binary(game_name) and player_id in @player_ids and
                  island_type in @island_types and is_integer(row) and
                  is_integer(col)

  @doc """
  No range check on `row` or `col`: island can be dropped partly outside board.
  """
  defguard valid_args?(game_name, player_id, row, col)
           when is_binary(game_name) and player_id in @player_ids and
                  is_integer(row) and is_integer(col)
end