lib/seo/breadcrumb/list_item.ex

defmodule SEO.Breadcrumb.ListItem do
  @moduledoc """
  One item in a `SEO.Breadcrumb.List`
  """

  defstruct [
    :position,
    :item,
    :name,
    "@type": "ListItem"
  ]

  @type t :: %__MODULE__{
          position: pos_integer(),
          "@type": String.t(),
          item: String.t() | URI.t()
        }

  @doc """
  One item within a breadcrumb list.

  The two required keys for every item are:

  - `:item` - The URL of the item, eg: "https://example.com/cats".
  - `:name` - The name of the item, eg: "Cats"

  You may optionally provide the position. If unset, then one will be generated
  for you based on its position in the list. (1-based)

  - `:position` - The position in the breadcrumb list, eg: 1 (first)

  For example:

  ```elixir
  SEO.Breadcrumb.ListItem.build(%{
    name: "Posts",
    item: Routes.blog_url(@endpoint, :index)
  })
  ```
  """

  @spec build(SEO.attrs(), SEO.config()) :: t() | nil
  def build(attrs, default \\ nil)

  def build(attrs, default) do
    SEO.Utils.merge_defaults(__MODULE__, attrs, default)
  end

  @doc false
  def to_map(%__MODULE__{} = list_item) do
    list_item |> Map.from_struct()
  end
end