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