]> granicus.if.org Git - ejabberd/commitdiff
Strip duplicates from module's options
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 7 Mar 2018 14:46:16 +0000 (17:46 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 7 Mar 2018 14:46:16 +0000 (17:46 +0300)
src/gen_mod.erl

index a477ec2956108c643af19311860c35fcbc7b0d8f..836e9dba84c6987fdb676535e466e974951d68ce 100644 (file)
@@ -555,7 +555,8 @@ validate_opts(Host, Module, Opts0) ->
                 undef ->
                     Opts;
                 Validators ->
-                    validate_opts(Host, Module, Opts, Required, Validators)
+                    Opts1 = validate_opts(Host, Module, Opts, Required, Validators),
+                    remove_duplicated_opts(Opts1)
             end}
     catch _:{missing_required_option, Opt} ->
            ErrTxt = io_lib:format("Module '~s' is missing required option '~s'",
@@ -680,6 +681,16 @@ merge_opts(Opts, DefaultOpts) ->
              end
       end, Result, Opts).
 
+remove_duplicated_opts([{Opt, Val}, {Opt, _Default}|Opts]) ->
+    [{Opt, Val}|remove_duplicated_opts(Opts)];
+remove_duplicated_opts([{Opt, [{SubOpt, _}|_] = SubOpts}|Opts])
+  when is_atom(SubOpt) ->
+    [{Opt, remove_duplicated_opts(SubOpts)}|remove_duplicated_opts(Opts)];
+remove_duplicated_opts([OptVal|Opts]) ->
+    [OptVal|remove_duplicated_opts(Opts)];
+remove_duplicated_opts([]) ->
+    [].
+
 -spec get_submodules(binary(), module(), opts()) -> [module()].
 get_submodules(Host, Module, Opts) ->
     try Module:mod_options(Host) of