fix: more work on metadata diff

This commit is contained in:
2026-04-27 10:38:36 +02:00
parent e7ccf02d40
commit 07730dc93e
10 changed files with 384 additions and 94 deletions

View File

@@ -0,0 +1,43 @@
defmodule BDS.DocumentFields do
@moduledoc false
def get(fields, key, default \\ nil) when is_map(fields) and is_binary(key) do
case fetch(fields, key) do
{:ok, value} -> value
:error -> default
end
end
def fetch!(fields, key) when is_map(fields) and is_binary(key) do
case fetch(fields, key) do
{:ok, value} -> value
:error -> raise KeyError, key: key, term: fields
end
end
def has_key?(fields, key) when is_map(fields) and is_binary(key) do
match?({:ok, _value}, fetch(fields, key))
end
def fetch(fields, key) when is_map(fields) and is_binary(key) do
key
|> aliases_for()
|> Enum.find_value(:error, fn alias_key ->
if Map.has_key?(fields, alias_key) do
{:ok, Map.get(fields, alias_key)}
end
end)
end
defp aliases_for(key) do
[key, Macro.underscore(key), lower_camelize(key)]
|> Enum.uniq()
end
defp lower_camelize(value) do
case Macro.camelize(value) do
<<first::utf8, rest::binary>> -> String.downcase(<<first::utf8>>) <> rest
"" -> ""
end
end
end