defmodule SEO.JSONLD do @moduledoc """ Renders JSON-LD structured data as ` """ end @context "https://schema.org" defp apply_context(nil), do: nil defp apply_context(items) when is_list(items), do: Enum.map(items, &apply_context/1) defp apply_context(item) when is_map(item) do Map.put_new(item, "@context", @context) end defp sanitize(nil), do: nil defp sanitize(items) when is_list(items) do cleaned = Enum.map(items, &drop_nils/1) |> Enum.reject(&empty?/1) case cleaned do [] -> nil [single] -> single multiple -> multiple end end defp sanitize(item) when is_struct(item) do item |> Map.from_struct() |> sanitize() end defp sanitize(item) when is_map(item) do cleaned = drop_nils(item) if empty?(cleaned), do: nil, else: cleaned end defp sanitize(_), do: nil defp drop_nils(map) when is_map(map) do for {k, v} <- map, v != nil, into: %{}, do: {k, v} end defp drop_nils(other), do: other defp empty?(map) when map_size(map) == 0, do: true defp empty?(_), do: false end