aboutsummaryrefslogtreecommitdiff
path: root/src/gen_mod.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen_mod.erl')
-rw-r--r--src/gen_mod.erl72
1 files changed, 41 insertions, 31 deletions
diff --git a/src/gen_mod.erl b/src/gen_mod.erl
index 783e823ef..fdfd94f2a 100644
--- a/src/gen_mod.erl
+++ b/src/gen_mod.erl
@@ -441,7 +441,7 @@ get_opt_host(Host, Opts, Default) ->
Val = get_opt(host, Opts, Default),
ejabberd_regexp:greplace(Val, <<"@HOST@">>, Host).
--spec get_validators(binary(), module(), opts()) -> {ok, [{atom(), check_fun()}]} | undef.
+-spec get_validators(binary(), module(), opts()) -> dict:dict() | undef.
get_validators(Host, Module, Opts) ->
try Module:mod_opt_type('') of
L ->
@@ -453,23 +453,29 @@ get_validators(Host, Module, Opts) ->
true -> [ram_db_mod(Host, Opts, Module)];
false -> []
end,
- {ok, dict:to_list(
- lists:foldl(
- fun(Mod, D) ->
- try Mod:mod_opt_type('') of
- Os ->
- lists:foldl(
- fun({Opt, SubOpt} = O, Acc) ->
- F = Mod:mod_opt_type(O),
- dict:append(Opt, {SubOpt, F}, Acc);
- (O, Acc) ->
- F = Mod:mod_opt_type(O),
- dict:store(O, F, Acc)
- end, D, Os)
- catch _:undef ->
- D
- end
- end, dict:new(), [Module|SubMods1 ++ SubMods2]))}
+ lists:foldl(
+ fun(Mod, D) ->
+ try Mod:mod_opt_type('') of
+ Os ->
+ lists:foldl(
+ fun({Opt, SubOpt} = O, Acc) ->
+ SubF = Mod:mod_opt_type(O),
+ F = case Mod:mod_opt_type(Opt) of
+ F1 when is_function(F1) ->
+ F1;
+ _ ->
+ fun(X) -> X end
+ end,
+ dict:append_list(
+ Opt, [F, {SubOpt, [SubF]}], Acc);
+ (O, Acc) ->
+ F = Mod:mod_opt_type(O),
+ dict:store(O, [F], Acc)
+ end, D, Os)
+ catch _:undef ->
+ D
+ end
+ end, dict:new(), [Module|SubMods1 ++ SubMods2])
catch _:undef ->
?WARNING_MSG("module '~s' doesn't export mod_opt_type/1",
[Module]),
@@ -479,26 +485,30 @@ get_validators(Host, Module, Opts) ->
-spec validate_opts(binary(), module(), opts()) -> opts().
validate_opts(Host, Module, Opts) ->
case get_validators(Host, Module, Opts) of
- {ok, Validators} ->
- validate_opts(Host, Module, Opts, Validators);
undef ->
- Opts
+ Opts;
+ Validators ->
+ validate_opts(Host, Module, Opts, dict:to_list(Validators))
end.
validate_opts(Host, Module, Opts, Validators) when is_list(Opts) ->
lists:flatmap(
fun({Opt, Val}) when is_atom(Opt) ->
case lists:keyfind(Opt, 1, Validators) of
- {_, VFun} when is_function(VFun) ->
- validate_opt(Module, Opt, Val, VFun);
- {_, SubValidators} ->
- try validate_opts(Host, Module, Val, SubValidators) of
- SubOpts -> [{Opt, SubOpts}]
- catch _:bad_option ->
- ?ERROR_MSG("ignoring invalid value '~p' for "
- "option '~s' of module '~s'",
- [Val, Opt, Module]),
- []
+ {_, L} ->
+ case lists:partition(fun is_function/1, L) of
+ {[VFun|_], []} ->
+ validate_opt(Module, Opt, Val, VFun);
+ {[VFun|_], SubValidators} ->
+ try validate_opts(Host, Module, Val, SubValidators) of
+ SubOpts ->
+ validate_opt(Module, Opt, SubOpts, VFun)
+ catch _:bad_option ->
+ ?ERROR_MSG("ignoring invalid value '~p' for "
+ "option '~s' of module '~s'",
+ [Val, Opt, Module]),
+ []
+ end
end;
false ->
?ERROR_MSG("unknown option '~s' for module '~s' will be"