diff --git a/src/list_validator.erl b/src/list_validator.erl index 04bf1ff..275ecaf 100644 --- a/src/list_validator.erl +++ b/src/list_validator.erl @@ -43,7 +43,9 @@ validate(Term, {item, Format}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - [{Index, Reason}|Accumulator] + [{Index, Reason}|Accumulator]; + OtherError -> + [{Index, OtherError}|Accumulator] end end, [], diff --git a/src/map_dynamic_validator.erl b/src/map_dynamic_validator.erl index 73422eb..7d814f3 100644 --- a/src/map_dynamic_validator.erl +++ b/src/map_dynamic_validator.erl @@ -41,7 +41,9 @@ validate(Term, {key, Format}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - [{Key, Reason}|Accumulator] + [{Key, Reason}|Accumulator]; + OtherError -> + [{Key, OtherError}|Accumulator] end end, [], maps:keys(Term)), case Result of @@ -57,7 +59,9 @@ validate(Term, {value, Format}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - [{Key, Reason}|Accumulator] + [{Key, Reason}|Accumulator]; + OtherError -> + [{Key, OtherError}|Accumulator] end end, [], Term), case Result of diff --git a/src/map_validator.erl b/src/map_validator.erl index 400bdf8..b8e1a0a 100644 --- a/src/map_validator.erl +++ b/src/map_validator.erl @@ -27,7 +27,7 @@ pre_validate(Term, Options, _Validators) when is_map(Term) -> pre_validate(_Term, _Options, _Validators) -> {invalid, not_map}. -validate(Term, {fields, Fields}, Validators) -> +validate(Term, {fields, Fields}, Validators) when is_list(Fields) -> % We first compute the missing fields by iterating over the declared % mandatory fields and check if they are all present in the Erlang map. % Then we compute the invalid and extra fields by iterating over the fields @@ -59,7 +59,9 @@ validate(Term, {fields, Fields}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - {UnexpectedFields, [{Key, Reason}|InvalidFields]} + {UnexpectedFields, [{Key, Reason}|InvalidFields]}; + OtherError -> + {UnexpectedFields, [{Key, OtherError}|InvalidFields]} end end end, @@ -79,7 +81,9 @@ validate(Term, {fields, Fields}, Validators) -> end; _ -> {invalid, {missing_fields, MissingFields}} - end. + end; +validate(_Term, {fields, _Fields}, _Validators) -> + {invalid_option_value, not_list}. post_validate(_Term, _Validators) -> valid. diff --git a/src/term_validator.erl b/src/term_validator.erl index 51d584b..2744b3a 100644 --- a/src/term_validator.erl +++ b/src/term_validator.erl @@ -153,14 +153,12 @@ has_dynamic_options(_MandatoryOptions, _OptionalOptions) -> -spec has_missing_options(options(), [option_name()]) -> no | {yes, [option_name()]}. has_missing_options(Options, MandatoryOptions) -> - % We remove mandatory option one by one if they're present. If there's - % remaining mandatory options, then we have missing options. - RemainingOptions = lists:dropwhile(fun(Name) -> - proplists:is_defined(Name, Options) + Missing = lists:filter(fun(Name) -> + not proplists:is_defined(Name, Options) end, MandatoryOptions), - case RemainingOptions of + case Missing of [] -> no; - _ -> {yes, RemainingOptions} + _ -> {yes, Missing} end. -spec has_invalid_options(options(), [option_name()]) -> diff --git a/src/tuple_dynamic_validator.erl b/src/tuple_dynamic_validator.erl index 92400fb..07d2309 100644 --- a/src/tuple_dynamic_validator.erl +++ b/src/tuple_dynamic_validator.erl @@ -43,7 +43,9 @@ validate(Term, {element, Format}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - [{Index, Reason}|Accumulator] + [{Index, Reason}|Accumulator]; + OtherError -> + [{Index, OtherError}|Accumulator] end end, [], diff --git a/src/tuple_validator.erl b/src/tuple_validator.erl index 8ecced5..9a7250b 100644 --- a/src/tuple_validator.erl +++ b/src/tuple_validator.erl @@ -39,7 +39,9 @@ validate(Term, {elements, Elements}, Validators) -> valid -> Accumulator; {invalid, Reason} -> - [{Index, Reason}|Accumulator] + [{Index, Reason}|Accumulator]; + OtherError -> + [{Index, OtherError}|Accumulator] end end, [], diff --git a/test/map_validator_test.erl b/test/map_validator_test.erl index 094a7b5..ca83058 100644 --- a/test/map_validator_test.erl +++ b/test/map_validator_test.erl @@ -71,3 +71,22 @@ map_validator_fields_test() -> true = lists:member({"bar", not_number}, Fields), ok. + +map_validator_options_test() -> + UnknownValidatorFormat = {map, [{fields, [ + {foo, unknown_validator, mandatory} + ]}]}, + {invalid, {fields, [{foo,{no_validator,unknown_validator}}]}} = term_validator:validate(#{ + foo => true + }, UnknownValidatorFormat), + + MissingOptionFormat = {map, []}, + {missing_options, [fields]} = term_validator:validate(#{}, MissingOptionFormat), + + InvalidOptionsFormat = {map, [{fields, []}, {unknown_option, true}]}, + {invalid_options, [unknown_option]} = term_validator:validate(#{}, InvalidOptionsFormat), + + InvalidOptionValue = {map, [{fields, atom}]}, + {invalid_option_value,{fields,atom},not_list} = term_validator:validate(#{}, InvalidOptionValue), + + ok.