defmodule Kameleoon.Data.Conversion do @moduledoc false alias Kameleoon.Data.Validation @enforce_keys [:goal_id] defstruct [:goal_id, revenue: nil, negative: false, metadata: []] @type t :: %__MODULE__{ goal_id: non_neg_integer(), revenue: number() | nil, negative: boolean(), metadata: [Kameleoon.Data.CustomData.t()] } @spec new!(non_neg_integer(), keyword()) :: t() def new!(goal_id, opts \\ []) do opts = Validation.keyword!(opts, revenue: nil, negative: false, metadata: []) %__MODULE__{ goal_id: Validation.u32!(goal_id, :goal_id), revenue: Validation.number_or_nil!(opts[:revenue], :revenue), negative: Validation.boolean!(opts[:negative], :negative), metadata: Validation.custom_data_list!(opts[:metadata], :metadata) } end end