lib/cf_sync/entry/document.ex

defmodule CFSync.Entry.Document do
  alias CFSync.Entry.Extractors

  @spec get_value(Extractors.data(), String.t(), keyword()) :: any()
  def get_value(%{fields: fields, locales: locales, locale: locale}, field, opts \\ []) do
    %{
      fields: fields,
      field: field,
      locale: locales[locale],
      force_locale: locales[opts[:force_locale]],
      fallback_locale: locales[opts[:fallback_locale]],
      value: nil
    }
    |> maybe_get_value_from(:force_locale)
    |> maybe_get_value_from(:locale)
    |> maybe_get_value_from(:fallback_locale)
    |> Map.get(:value)
  end

  defp maybe_get_value_from(%{force_locale: nil} = params, :force_locale) do
    params
  end

  defp maybe_get_value_from(%{force_locale: fl} = params, :locale) when fl != nil do
    params
  end

  defp maybe_get_value_from(%{fields: fields, field: field, value: nil} = params, locale_key) do
    locale = params[locale_key]
    %{params | value: fields[field][locale]}
  end

  defp maybe_get_value_from(params, _) do
    params
  end
end