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.