# This file is auto-generated by alef — DO NOT EDIT.
# alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
# To regenerate: alef generate
# To verify freshness: alef verify --exit-code
# Issues & docs: https://github.com/kreuzberg-dev/alef
defmodule Kreuzberg.HtmlMetadata do
  @moduledoc """
  HTML metadata extracted from HTML documents.

  Includes document-level metadata, Open Graph data, Twitter Card metadata,
  and extracted structural elements (headers, links, images, structured data).
  """

  @typedoc "HTML metadata extracted from HTML documents."
  @type t :: %__MODULE__{
          title: String.t() | nil,
          description: String.t() | nil,
          keywords: [String.t()],
          author: String.t() | nil,
          canonical_url: String.t() | nil,
          base_href: String.t() | nil,
          language: String.t() | nil,
          text_direction: String.t() | nil | nil,
          open_graph: map(),
          twitter_card: map(),
          meta_tags: map(),
          headers: [map()],
          links: [map()],
          images: [map()],
          structured_data: [map()]
        }

  defstruct title: nil,
            description: nil,
            keywords: [],
            author: nil,
            canonical_url: nil,
            base_href: nil,
            language: nil,
            text_direction: nil,
            open_graph: %{},
            twitter_card: %{},
            meta_tags: %{},
            headers: [],
            links: [],
            images: [],
            structured_data: []

  defimpl Jason.Encoder do
    @doc false
    def encode(value, opts) do
      value
      |> Map.from_struct()
      |> Enum.reject(fn {_k, v} -> v == nil end)
      |> Enum.into(%{})
      |> Jason.Encoder.encode(opts)
    end
  end
end
