lib/windog/structs/race_context.ex

defmodule Windog.Structs.RaceContext do
  alias Windog.Structs

  @keys [
    :players,
    :line,
    :results,
    :odds,
    :race,
    :cup,
    :venue,
    :is_defect_line,
    :has_absent_player,
    :has_accident,
    :is_finish
  ]

  @enforce_keys @keys

  defstruct @keys

  # finish: true
  def validate(%{
        players: [%Structs.Player{} | _] = players,
        results: [%Structs.ResultItem{} | _] = results,
        odds: %Structs.Odds{} = odds,
        race: %Structs.Race{} = race,
        cup: %Structs.Cup{} = cup,
        line: line,
        venue: %Structs.Venue{} = venue,
        is_defect_line: is_defect_line,
        has_absent_player: has_absent_player,
        has_accident: has_accident,
        is_finish: true = is_finish
      })
      when is_boolean(is_defect_line) and is_boolean(is_finish) and
             (is_list(line) or is_nil(line)) and is_boolean(has_accident) and
             is_boolean(has_absent_player) do
    %__MODULE__{
      players: players,
      line: line,
      results: results,
      odds: odds,
      race: race,
      cup: cup,
      venue: venue,
      is_defect_line: is_defect_line,
      has_absent_player: has_absent_player,
      has_accident: has_accident,
      is_finish: is_finish
    }
  end

  # finish: false
  def validate(%{
        players: [%Structs.Player{} | _] = players,
        results: [] = results,
        odds: %Structs.Odds{} = odds,
        race: %Structs.Race{} = race,
        cup: %Structs.Cup{} = cup,
        line: line,
        venue: %Structs.Venue{} = venue,
        is_defect_line: is_defect_line,
        has_absent_player: has_absent_player,
        has_accident: has_accident,
        is_finish: false = is_finish
      })
      when is_boolean(is_defect_line) and is_boolean(is_finish) and
             (is_list(line) or is_nil(line)) and is_boolean(has_absent_player) and
             is_boolean(has_accident) do
    %__MODULE__{
      players: players,
      line: line,
      results: results,
      odds: odds,
      race: race,
      cup: cup,
      venue: venue,
      is_defect_line: is_defect_line,
      has_absent_player: has_absent_player,
      has_accident: has_accident,
      is_finish: is_finish
    }
  end
end