defmodule Kameleoon.Data.CustomData do @moduledoc false alias Kameleoon.Data.Validation defstruct index: nil, name: nil, values: [], overwrite: true @type t :: %__MODULE__{ index: non_neg_integer() | nil, name: String.t() | nil, values: [String.t()], overwrite: boolean() } @spec new!(non_neg_integer() | String.t(), [String.t()], keyword()) :: t() def new!(identifier, values, opts \\ []) do opts = Validation.keyword!(opts, overwrite: true) values = Validation.string_list!(values, :values) overwrite = Validation.boolean!(opts[:overwrite], :overwrite) case identifier do index when is_integer(index) -> index = Validation.u32!(index, :index) %__MODULE__{ index: index, values: values, overwrite: overwrite } name when is_binary(name) -> name = Validation.non_empty_string!(name, :name) %__MODULE__{ name: name, values: values, overwrite: overwrite } value -> raise ArgumentError, "expected :index or :name to be an unsigned 32-bit integer or a non-empty string, got: #{inspect(value)}" end end end