chore: more detailed about about retainer index spec

This commit is contained in:
Zhongwen Deng 2022-06-01 16:59:58 +08:00
parent de5e388afb
commit 2f5e0ada0c
1 changed files with 25 additions and 14 deletions

View File

@ -124,22 +124,33 @@ retainer_indices(example) ->
retainer_indices(default) -> retainer_indices(default) ->
?DEFAULT_INDICES; ?DEFAULT_INDICES;
retainer_indices(validator) -> retainer_indices(validator) ->
fun is_valid_index_specs/1; fun check_index_specs/1;
retainer_indices(_) -> retainer_indices(_) ->
undefined. undefined.
is_valid_index_specs(IndexSpecs) -> check_index_specs([]) ->
case lists:all(fun is_valid_index_spec/1, IndexSpecs) of ok;
true -> check_index_specs(IndexSpecs) when is_list(IndexSpecs) ->
case length(IndexSpecs) =:= ordsets:size(ordsets:from_list(IndexSpecs)) of lists:foreach(fun check_index_spec/1, IndexSpecs),
true -> ok; check_duplicate(IndexSpecs);
false -> {error, duplicate_index_specs} check_index_specs(_IndexSpecs) ->
invalid_spec(list_index_spec_limited).
check_index_spec([]) ->
invalid_spec(non_empty_index_spec_limited);
check_index_spec(IndexSpec) when is_list(IndexSpec) ->
case lists:all(fun(Idx) -> is_integer(Idx) andalso Idx > 0 end, IndexSpec) of
false -> invalid_spec(pos_integer_index_limited);
true -> check_duplicate(IndexSpec)
end; end;
false -> check_index_spec(_IndexSpec) ->
{error, invalid_index_spec} invalid_spec(list_index_spec_limited).
check_duplicate(List) ->
case length(List) =:= length(lists:usort(List)) of
false -> invalid_spec(unique_index_spec_limited);
true -> ok
end. end.
is_valid_index_spec(IndexSpec) -> invalid_spec(Reason) ->
length(IndexSpec) > 0 andalso throw({Reason, #{default => ?DEFAULT_INDICES}}).
lists:all(fun(Idx) -> Idx > 0 end, IndexSpec) andalso
IndexSpec =:= ordsets:to_list(ordsets:from_list(IndexSpec)).