defmodule Ravix.Documents.Metadata do @moduledoc """ Functions related to document metadata management """ @doc """ Builds the metadata for the informed document """ @spec build_default_metadata(map()) :: nil | %{:"@collection" => any, optional(any) => any} def build_default_metadata(entity) do case collection_name(entity) do nil -> nil collection_name -> metadata = case existing_metadata(entity) do nil -> %{} metadata -> metadata end Map.put(metadata, :"@collection", collection_name) end end @doc """ Adds the metadata to the entity """ @spec add_metadata(map(), nil | map) :: map() def add_metadata(entity, nil), do: entity def add_metadata(entity, metadata) when is_map(entity), do: Map.put(entity, :"@metadata", metadata) def add_metadata(entity, metadata) when is_struct(entity), do: put_in(entity."@metadata", metadata) defp existing_metadata(entity) when not is_map_key(entity, :"@metadata"), do: %{} defp existing_metadata(entity), do: entity."@metadata" defp collection_name(entity) when not is_struct(entity), do: nil defp collection_name(entity), do: entity.__struct__ |> Module.split() |> Enum.reverse() |> Enum.at(0) |> Inflex.pluralize() end