]> granicus.if.org Git - ejabberd/commitdiff
Improve error formatting
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Mon, 17 Sep 2018 09:08:04 +0000 (12:08 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Mon, 17 Sep 2018 09:08:04 +0000 (12:08 +0300)
src/ejabberd_config.erl
src/gen_mod.erl
src/misc.erl

index 6146695c20e56edd146885482aff101bfdf2f549..d1e7a2f454400d15674f1652db55399bc26c165b 100644 (file)
@@ -1081,12 +1081,12 @@ validate_opts(#state{opts = Opts} = State, ModOpts) ->
                                            ?ERROR_MSG("Invalid value for "
                                                       "option '~s' (~s): ~s",
                                                       [Opt, Error,
-                                                       misc:format_val(Val)]),
+                                                       misc:format_val({yaml, Val})]),
                                            erlang:error(invalid_option);
                                          _:_ ->
                                            ?ERROR_MSG("Invalid value for "
                                                       "option '~s': ~s",
-                                                      [Opt, misc:format_val(Val)]),
+                                                      [Opt, misc:format_val({yaml, Val})]),
                                            erlang:error(invalid_option)
                                    end;
                                _ ->
index c15b50443626ee1a7923f8ab8f6aa1015b8fe7c8..6575e1e8217e07f589cd4abc3af2382713a196ed 100644 (file)
@@ -67,7 +67,7 @@
 -type opts() :: [{atom(), any()}].
 -type db_type() :: atom().
 
--callback start(binary(), opts()) -> ok | {ok, pid()}.
+-callback start(binary(), opts()) -> ok | {ok, pid()} | {error, term()}.
 -callback stop(binary()) -> any().
 -callback reload(binary(), opts(), opts()) -> ok | {ok, pid()}.
 -callback mod_opt_type(atom()) -> fun((term()) -> term()) | [atom()].
@@ -548,12 +548,12 @@ validate_opts(Host, Module, Opts0) ->
          _:{invalid_option, Opt, Val} ->
            ErrTxt = io_lib:format("Invalid value for option '~s' of "
                                   "module ~s: ~s",
-                                  [Opt, Module, misc:format_val(Val)]),
+                                  [Opt, Module, misc:format_val({yaml, Val})]),
            module_error(ErrTxt);
          _:{invalid_option, Opt, Val, Reason} ->
            ErrTxt = io_lib:format("Invalid value for option '~s' of "
                                   "module ~s (~s): ~s",
-                                  [Opt, Module, Reason, misc:format_val(Val)]),
+                                  [Opt, Module, Reason, misc:format_val({yaml, Val})]),
            module_error(ErrTxt);
          _:{unknown_option, Opt, []} ->
            ErrTxt = io_lib:format("Unknown option '~s' of module '~s': "
@@ -730,6 +730,9 @@ format_module_error(Module, Fun, Arity, Opts, Class, Reason, St) ->
                          "it doesn't export ~s/~B callback: "
                          "is it really an ejabberd module?",
                          [Fun, Module, Fun, Arity]);
+       {error, {bad_return, Module, {error, _} = Err}} ->
+           io_lib:format("Failed to ~s module ~s: ~s",
+                         [Fun, Module, misc:format_val(Err)]);
        {error, {bad_return, Module, Ret}} ->
            io_lib:format("Module ~s returned unexpected value from ~s/~B:~n"
                           "** Error: ~p~n"
index 5ef71c41b95b8879e521dc9347e90c24ca23f3e0..c415e981707a141a7ee8aee9200635436d94bddf 100644 (file)
@@ -297,15 +297,24 @@ intersection(L1, L2) ->
       end, L1).
 
 -spec format_val(any()) -> iodata().
+format_val({yaml, S}) when is_integer(S); is_binary(S); is_atom(S) ->
+    format_val(S);
+format_val({yaml, YAML}) ->
+    S = try fast_yaml:encode(YAML)
+       catch _:_ -> YAML
+       end,
+    format_val(S);
 format_val(I) when is_integer(I) ->
     integer_to_list(I);
-format_val(S) when is_binary(S) ->
-    <<$", S/binary, $">>;
 format_val(B) when is_atom(B) ->
     erlang:atom_to_binary(B, utf8);
-format_val(YAML) ->
-    try [io_lib:nl(), fast_yaml:encode(YAML)]
-    catch _:_ -> io_lib:format("~p", [YAML])
+format_val(Term) ->
+    S = try iolist_to_binary(Term)
+       catch _:_ -> list_to_binary(io_lib:format("~p", [Term]))
+       end,
+    case binary:match(S, <<"\n">>) of
+       nomatch -> S;
+       _ -> [io_lib:nl(), S]
     end.
 
 -spec cancel_timer(reference()) -> ok.