+-spec validate_unique_presence(t(K, _V), [K]) ->
+ hope_result:t(ok, [presence_error(K)]).
+validate_unique_presence(T, KeysRequired) ->
+ KeysOptional = [],
+ validate_unique_presence(T, KeysRequired, KeysOptional).
+
+-spec validate_unique_presence(t(K, _V), [K], [K]) ->
+ hope_result:t(ok, [presence_error(K)]).
+validate_unique_presence(T, KeysRequired, KeysOptional) ->
+ KeysSupported = KeysRequired ++ KeysOptional,
+ KeysGiven = [K || {K, _V} <- T],
+ KeysGivenUnique = lists:usort(KeysGiven),
+ KeysDups = lists:usort(KeysGiven -- KeysGivenUnique),
+ KeysMissing = KeysRequired -- KeysGivenUnique,
+ KeysUnsupported = KeysGivenUnique -- KeysSupported,
+ case {KeysDups, KeysMissing, KeysUnsupported}
+ of {[], [], []} ->
+ {ok, ok}
+ ; {Dups, Missing, Unsupported} ->
+ ErrorDups =
+ case Dups
+ of [] -> []
+ ; [_|_] -> [{keys_duplicated, Dups}]
+ end,
+ ErrorMissing =
+ case Missing
+ of [] -> []
+ ; [_|_] -> [{keys_missing, Missing}]
+ end,
+ ErrorUnsupported =
+ case Unsupported
+ of [] -> []
+ ; [_|_] -> [{keys_unsupported, Unsupported}]
+ end,
+ Errors = ErrorDups ++ ErrorMissing ++ ErrorUnsupported,
+ {error, Errors}
+ end.
+