lib/helper/ecto/module/util.ex

# Copyright (c) 2021 Anand Panchapakesan
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT

defmodule Helper.Ecto.Module.Util do
  @moduledoc """
  Populate introspection values that shall be exposed as a function
  """

  import Helper.Ecto.Attribute, only: [get_function_flags: 1, get_function_list: 1]
  import Map, only: [merge: 2]

  @func_list ~w(cast_fields required_fields assoc_fields)a
  @func_flags ~w(timestamped? audited? activatable? versioned? soft_delete?)a

  @fields [
    cast_fields: [],
    required_fields: [],
    assoc_fields: [],
    versioned?: false,
    timestamped?: false,
    activatable?: false,
    audited?: false,
    soft_delete?: false
  ]
  @enforce_keys ~w()a

  defstruct @fields

  @type ast() :: Macro.t()

  @type t() :: %__MODULE__{
          activatable?: boolean(),
          assoc_fields: keyword(),
          audited?: boolean(),
          cast_fields: keyword(),
          required_fields: keyword(),
          soft_delete?: boolean(),
          timestamped?: boolean(),
          versioned?: boolean()
        }

  @spec init(list(), list()) :: t()
  def init(fields, funs) do
    struct!(__MODULE__, [])
    |> merge(funs |> get_function_flags() |> Map.take(@func_flags))
    |> merge(fields |> get_function_list() |> Map.take(@func_list))
  end
end