Skip to main content

lib/kameleoon/data/custom_data.ex

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