defmodule MapUtils do require Logger def all_required_keys?(map, list) when is_map(map) and is_list(list) do keys = Map.keys(map) ok = Enum.all?(list, fn k -> Enum.member?(keys, k) end) if not ok do Logger.error("Missing a required key among " <> inspect(list)) Logger.error(" in " <> inspect(map)) end ok end def filter_keys_by_regex(dict, regex) when is_nil(dict) or is_nil(regex) or map_size(dict) == 0, do: [] def filter_keys_by_regex(dict, regex) when is_map(dict) and is_binary(regex) do case RegexUtils.compile(regex) do {:ok, regex} -> filter_keys_by_regex(dict, regex) {:error, error} -> Logger.error("Wrong regex '" <> regex <> "': the error is: '" <> inspect(error)) [] end end def filter_keys_by_regex(dict, regex) when is_map(dict) do ListUtils.filter_by_regex(Map.keys(dict), regex) end def match_keys_by_regex?(dict, regex) when is_nil(dict) or is_nil(regex) or map_size(dict) == 0, do: false def match_keys_by_regex?(dict, regex) when is_map(dict) do Enum.count(filter_keys_by_regex(dict, regex)) > 0 end def match_keys_values_by_regex?(dict, key_regex, value_regex) when is_nil(dict) or is_nil(key_regex) or is_nil(value_regex) or map_size(dict) == 0, do: false def match_keys_values_by_regex?(dict, key_regex, value_regex) when is_map(dict) do keys = filter_keys_by_regex(dict, key_regex) values = Enum.map(keys, fn x -> dict[x] end) values_without_nil = Enum.reject(values, &is_nil/1) Enum.count(ListUtils.filter_by_regex(values_without_nil, value_regex)) > 0 end end