Skip to main content

lib/council_ex/round_result.ex

defmodule CouncilEx.RoundResult do
  @moduledoc "Per-round execution result."

  alias CouncilEx.MemberResult

  @enforce_keys [:name, :index, :member_results]
  defstruct [
    :name,
    :index,
    :member_results,
    :aggregated,
    :started_at,
    :finished_at,
    :duration_ms,
    metadata: %{}
  ]

  @type t :: %__MODULE__{
          name: atom(),
          index: non_neg_integer(),
          member_results: %{atom() => MemberResult.t()},
          aggregated: map() | nil,
          started_at: DateTime.t() | nil,
          finished_at: DateTime.t() | nil,
          duration_ms: non_neg_integer() | nil,
          metadata: map()
        }

  @spec new(keyword()) :: t()
  def new(opts) do
    started = Keyword.get(opts, :started_at)
    finished = Keyword.get(opts, :finished_at)

    duration =
      case {started, finished} do
        {%DateTime{} = s, %DateTime{} = f} -> DateTime.diff(f, s, :millisecond)
        _ -> Keyword.get(opts, :duration_ms)
      end

    struct!(__MODULE__, Keyword.put(opts, :duration_ms, duration))
  end
end