, find_unique_presence_violations/3 % Specify optional keys
, validate_unique_presence/2 % No optional keys
, validate_unique_presence/3 % Specify optional keys
+ , presence_violations_to_list/1
]).
% TODO: Decide if validation is to be done here. Do so if yes.
List.
--spec validate_unique_presence(t(K, _V), [K]) ->
- hope_result:t(ok, [presence_error(K)]).
+-spec validate_unique_presence(T, [K]) ->
+ hope_result:t(T, [presence_error(K)])
+ when T :: t(K, _V).
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)]).
+ hope_result:t(T, [presence_error(K)])
+ when T :: t(K, _V).
validate_unique_presence(T, KeysRequired, KeysOptional) ->
case find_unique_presence_violations(T, KeysRequired, KeysOptional)
of #hope_kv_list_presence_violations
, keys_duplicated = []
, keys_unsupported = []
} ->
- {ok, ok}
- ; #hope_kv_list_presence_violations
- { keys_missing = KeysMissing
- , keys_duplicated = KeysDuplicated
- , keys_unsupported = KeysUnsupported
- } ->
- ErrorMissing =
- case KeysMissing
- of [] -> []
- ; [_|_] -> [{keys_missing, KeysMissing}]
- end,
- ErrorDups =
- case KeysDuplicated
- of [] -> []
- ; [_|_] -> [{keys_duplicated, KeysDuplicated}]
- end,
- ErrorUnsupported =
- case KeysUnsupported
- of [] -> []
- ; [_|_] -> [{keys_unsupported, KeysUnsupported}]
- end,
- Errors = ErrorDups ++ ErrorMissing ++ ErrorUnsupported,
- {error, Errors}
+ {ok, T}
+ ; #hope_kv_list_presence_violations{}=Violations ->
+ {error, presence_violations_to_list(Violations)}
end.
-spec find_unique_presence_violations(t(K, _V), [K]) ->
, keys_unsupported = KeysUnsupported
}.
+-spec presence_violations_to_list(presence_violations(K)) ->
+ [presence_error(K)].
+presence_violations_to_list(#hope_kv_list_presence_violations
+{ keys_missing = KeysMissing
+, keys_duplicated = KeysDuplicated
+, keys_unsupported = KeysUnsupported
+}) ->
+ ErrorMissing =
+ case KeysMissing
+ of [] -> []
+ ; [_|_] -> [{keys_missing, KeysMissing}]
+ end,
+ ErrorDups =
+ case KeysDuplicated
+ of [] -> []
+ ; [_|_] -> [{keys_duplicated, KeysDuplicated}]
+ end,
+ ErrorUnsupported =
+ case KeysUnsupported
+ of [] -> []
+ ; [_|_] -> [{keys_unsupported, KeysUnsupported}]
+ end,
+ ErrorDups ++ ErrorMissing ++ ErrorUnsupported.
+
%% ============================================================================
%% Helpers