Erlang field-level input validation
Erlang
-module(input_validation).
-export([validate/2]).
validate(Input, Rules) ->
Errors = maps:fold(fun(F, Rule, Acc) ->
case check(maps:get(F, Input, undefined), Rule) of
ok -> Acc;
{error, Msg} -> [{F, Msg} | Acc]
end
end, [], Rules),
case Errors of
[] -> {ok, Input};
_ -> {error, lists:reverse(Errors)}
end.
check(undefined, required) -> {error, <<"is required">>};
check(_Value, required) -> ok;
check(Value, {one_of, Allowed}) ->
case lists:member(Value, Allowed) of
true -> ok;
false -> {error, <<"is not an allowed value">>}
end.