lib/ex_teal/fields/embedded.ex

defmodule ExTeal.Embedded do
  @moduledoc """
  Generates a panel that contains the fields for a single embed, defined by its
  field name
  """

  alias ExTeal.{Field, Panel}
  alias ExTeal.Fields.Hidden

  @spec new(atom(), [Field.t()], String.t() | nil) :: Panel.t()
  def new(name, fields, label \\ nil) do
    fields =
      [Hidden.make(:id) | fields]
      |> Enum.map(fn field ->
        attr = :"#{name}.#{field.attribute}"
        %{field | attribute: attr, embed_field: name}
      end)

    name = Field.field_name(name, label)
    Panel.new(name, fields)
  end
end