# 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