version: 1.0.0

+ map_validate/2: a simple way to validate maps
+ gitversion.mk removed
This commit is contained in:
Umgeher Torgersen 2024-10-13 19:36:09 +00:00
parent 7b5b494cbb
commit b5e2fecca5
4 changed files with 82 additions and 8 deletions

View file

@ -4,6 +4,7 @@
-export([b32_encode/1]).
-export([hex_encode/1]).
-export([hotp/2]).
-export([map_validate/2]).
-export([rand_bytes/0, rand_bytes/1]).
-export([rand_chars/1]).
-export([rand_hash/0]).
@ -85,6 +86,45 @@ hotp(Token, Time) ->
P = << <<48:8>> || _ <- lists:seq(1, 6 - byte_size(T)) >>,
{ok, <<P/binary, T/binary>>}.
map_validate({_, _, {error, _} = Error}) ->
Error;
map_validate({Map, #{with := W} = Doc, R}) when is_list(W) ->
map_validate({maps:with(W, Map), maps:remove(with, Doc), R});
map_validate({Map, #{rules := []} = Doc, R}) ->
map_validate({Map, maps:remove(rules, Doc), R});
map_validate({Map, #{rules := [#{key := K, required := true} = Rule | T]} = Doc, R}) ->
map_validate({Map, Doc#{rules => T}, map_validate_rule(maps:get(K, Map, required), maps:remove(required, Rule), R)});
map_validate({Map, #{rules := [#{key := K, default := nil} = Rule | T]} = Doc, R}) ->
map_validate({Map, Doc#{rules => T}, map_validate_rule(maps:get(K, Map, nil), maps:remove(required, Rule), R)});
map_validate({Map, #{rules := [#{key := K, default := V} = Rule | T]} = Doc, R}) ->
map_validate({Map, Doc#{rules => T}, map_validate_rule(maps:get(K, Map, V), maps:remove(required, Rule), R)});
map_validate({Map, #{rules := [_ | T]} = Doc, R}) ->
map_validate({Map, Doc#{rules => T}, R});
map_validate({Map, #{merge := true} = Doc, R}) ->
map_validate({nil, maps:remove(merge, Doc), maps:merge(Map, R)});
map_validate({_, #{without := W}, R}) when is_list(W) ->
map_validate({nil, #{}, maps:without(W, R)});
map_validate({_, #{}, R}) ->
R.
map_validate(#{} = Map, #{} = Doc) ->
map_validate({Map, Doc, #{}});
map_validate(_, _) ->
{error, 'no data'}.
map_validate_rule(required, #{key := K}, _) ->
{error, K};
map_validate_rule(nil, _, M) ->
M;
map_validate_rule(V, #{prefn := FN} = Rule, M) when is_function(FN) ->
map_validate_rule(FN(V), maps:remove(prefn, Rule), M);
map_validate_rule(V, #{posfn := FN} = Rule, M) when is_function(FN) ->
map_validate_rule(FN(V), maps:remove(posfn, Rule), M);
map_validate_rule(V, #{key := K}, M) ->
M#{K => V};
map_validate_rule(_, _, _) ->
{error, invalid}.
rand_bytes() ->
rand_bytes(8).