Blob Blame History Raw
From: Peter Lemenkov <lemenkov@gmail.com>
Date: Thu, 27 Jan 2022 12:55:59 +0100
Subject: [PATCH] Bundle hut header

We're using hut.[eh]rl fetched from these links:

* https://raw.githubusercontent.com/tolbrino/hut/cd3e5b05c1efe6cd0351c435fbca1343702f1564/include/hut.hrl
* https://raw.githubusercontent.com/tolbrino/hut/cd3e5b05c1efe6cd0351c435fbca1343702f1564/src/hut.erl

Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>

diff --git a/rebar.config b/rebar.config
index e2e8738..195c7b0 100644
--- a/rebar.config
+++ b/rebar.config
@@ -3,7 +3,6 @@
  [
   {parse_trans, "3.4.1"},
   {folsom, "1.0.0"},
-  {hut, "1.3.0"},
   {setup, "2.1.0"}
  ]}.
 
diff --git a/src/exometer_admin.erl b/src/exometer_admin.erl
index 8cf62ea..ac63018 100644
--- a/src/exometer_admin.erl
+++ b/src/exometer_admin.erl
@@ -48,7 +48,7 @@
 -export([monitor/2, monitor/3, demonitor/1]).
 
 -compile({no_auto_import, [monitor/3]}).
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
 -include("exometer.hrl").
 
 -record(st, {}).
diff --git a/src/exometer_core.app.src b/src/exometer_core.app.src
index d314559..afa8151 100644
--- a/src/exometer_core.app.src
+++ b/src/exometer_core.app.src
@@ -2,7 +2,7 @@
              [{description,"Code instrumentation and metrics collection package."},
               {vsn,git},
               {registered,[]},
-              {applications,[kernel,stdlib,hut,setup,folsom,parse_trans]},
+              {applications,[kernel,stdlib,setup,folsom,parse_trans]},
               {included_applications,[]},
               {mod,{exometer_core_app,[]}},
               {start_phases,[{start_reporters,[]},{preset_defaults,[]}]},
diff --git a/src/exometer_folsom_monitor.erl b/src/exometer_folsom_monitor.erl
index 148616a..8535789 100644
--- a/src/exometer_folsom_monitor.erl
+++ b/src/exometer_folsom_monitor.erl
@@ -37,7 +37,7 @@
 -record(st, {mon = orddict:new()}).
 
 -include_lib("parse_trans/include/codegen.hrl").
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
 -include("exometer.hrl").
 
 -type type() :: exometer:type().
diff --git a/src/exometer_report.erl b/src/exometer_report.erl
index 68c9a1e..63f4ed1 100644
--- a/src/exometer_report.erl
+++ b/src/exometer_report.erl
@@ -213,7 +213,7 @@
 
 -export_type([metric/0, datapoint/0, interval/0, extra/0]).
 
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
 -include("exometer.hrl").
 
 -define(SERVER, ?MODULE).
diff --git a/src/exometer_report_tty.erl b/src/exometer_report_tty.erl
index b08ae97..5cd88bf 100644
--- a/src/exometer_report_tty.erl
+++ b/src/exometer_report_tty.erl
@@ -40,7 +40,7 @@
     exometer_terminate/2
    ]).
 
--include_lib("hut/include/hut.hrl").
+-include("hut.hrl").
 -include("exometer.hrl").
 
 -define(SERVER, ?MODULE).
diff --git a/src/hut.hrl b/src/hut.hrl
new file mode 100644
index 0000000..a6f46e2
--- /dev/null
+++ b/src/hut.hrl
@@ -0,0 +1,185 @@
+%% -*- erlang -*-
+
+-ifndef(__HUT_HRL__).
+-define(__HUT_HRL__, true).
+
+%% Supported logging levels (taken from lager):
+-define(__log_levels, [debug, info, notice, warning, error, critical, alert, emergency]).
+-define(__default_log_level, info).
+-define(__default_use_log_level_gate, true).
+
+%% Helper macros
+-define(__fmt(__Fmt, __Args), lists:flatten(io_lib:format(__Fmt, __Args))).
+
+-define(__maybe_log(__Level, __Fun),
+        ((fun() ->
+                   __UseGate = application:get_env(hut, use_log_level_gate, ?__default_use_log_level_gate),
+                  case __UseGate of
+                      true ->
+                          __CurrentLevel = application:get_env(hut, level, ?__default_log_level),
+                          __AllowedLevels = lists:dropwhile(fun(__Element) -> __Element =/= __CurrentLevel end, ?__log_levels),
+                          __IsEnabled = lists:member(__Level, __AllowedLevels),
+                          case __IsEnabled of
+                              true ->
+                                  __Fun();
+                              _ ->
+                                  ok
+                          end;
+                      _ ->
+                          __Fun()
+                  end
+          end)())).
+
+
+-define(__hut_logger_metadata,
+        #{ mfa => {?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY}
+         , file => ?FILE
+         , line => ?LINE
+         }).
+
+%% Lager support
+
+-ifdef(HUT_LAGER).
+-define(log_type, "lager").
+
+-ifndef(HUT_LAGER_SINK).
+-define(HUT_LAGER_SINK, lager).
+-endif.
+
+-define(log(__Level, __Fmt),
+        ?HUT_LAGER_SINK:__Level([], __Fmt, [])).
+-define(log(__Level, __Fmt, __Args),
+        ?HUT_LAGER_SINK:__Level([], __Fmt, __Args)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+        ?HUT_LAGER_SINK:__Level(__Opts, __Fmt, __Args)).
+
+-else. %% HUT_LAGER
+
+% Using plain `io:format/2`.
+
+-ifdef(HUT_IOFORMAT).
+-define(log_type, "ioformat").
+
+-define(log(__Level, __Fmt),
+        ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "~n", [__Level]) end)).
+-define(log(__Level, __Fmt, __Args),
+        ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "~n", [__Level] ++ __Args) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+        ?__maybe_log(__Level, fun() -> io:format("~p: " ++ __Fmt ++ "; Opts: ~p~n", [__Level] ++ __Args ++ [__Opts]) end)).
+
+-else. %% HUT_IOFORMAT
+
+% All logging calls are passed into a custom logging callback module given by `HUT_CUSTOM_CB`.
+
+-ifdef(HUT_CUSTOM).
+-define(log_type, "custom").
+
+-define(log(__Level, __Fmt),
+        ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, [], maps:to_list(?__hut_logger_metadata)) end)).
+-define(log(__Level, __Fmt, __Args),
+        ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, __Args, maps:to_list(?__hut_logger_metadata)) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+        ?__maybe_log(__Level, fun() -> ?HUT_CUSTOM_CB:log(__Level, __Fmt, __Args, __Opts) end)).
+
+-ifdef(HUT_CUSTOM_SLOG).
+-define(slog(__Level, __Data, __Meta),
+        ?HUT_CUSTOM_CB:slog(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+-define(slog(__Level, __Data),
+        ?HUT_CUSTOM_CB:slog(__Level, __Data, ?__hut_logger_metadata)).
+-endif. %% HUT_CUSTOM_SLOG
+
+-else. %% HUT_CUSTOM
+
+% All logging calls are ignored.
+
+-ifdef(HUT_NOOP).
+-define(log_type, "noop").
+
+-define(log(__Level, __Fmt), true).
+-define(log(__Level, __Fmt, __Args), true).
+-define(log(__Level, __Fmt, __Args, __Opts), true).
+
+-else. %% HUT_NOOP
+
+-ifndef(OTP_RELEASE).
+% If none of the above options were defined and OTP version is below 21, default to SASL
+-ifndef(HUT_SASL).
+-define(HUT_SASL, true).
+-endif.
+-endif. %% !OTP_RELEASE
+
+-ifdef(HUT_SASL).
+
+-define(log_type, "sasl").
+
+-define(log(__Level, __Fmt),
+        ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, [], []) end)).
+-define(log(__Level, __Fmt, __Args),
+        ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, __Args, []) end)).
+-define(log(__Level, __Fmt, __Args, __Opts),
+        ?__maybe_log(__Level, fun() -> hut:log(?log_type, __Level, __Fmt, __Args, __Opts) end)).
+
+-else. %% HUT_SASL
+
+% On OTP21+ use logger by default
+
+-define(log_type, "logger").
+
+-define(log(__Level, __Fmt, __Args, __Opts),
+        logger:log(__Level, __Fmt ++ "; Opts ~p", __Args ++ [__Opts], ?__hut_logger_metadata)).
+-define(log(__Level, __Fmt, __Args),
+        logger:log(__Level, __Fmt, __Args, ?__hut_logger_metadata)).
+-define(log(__Level, __Fmt),
+        ?log(__Level, __Fmt, [])).
+
+% Structured report:
+-define(slog(__Level, __Data, __Meta),
+        logger:log(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+-define(slog(__Level, __Data),
+        ?slog(__Level, __Data, #{})).
+
+% Set metadata:
+-define(set_process_metadata(__Meta),
+        logger:set_process_metadata(__Meta)).
+
+% End of all actual log implementation switches.
+-endif. %% HUT_SASL
+-endif. %% HUT_NOOP
+-endif. %% HUT_CUSTOM
+-endif. %% HUT_IOFORMAT
+-endif. %% HUT_LAGER
+
+-ifndef(slog).
+%% Poor man's OTP21 `logger' structured log:
+
+-define(__hut_slog_helper(__Level, __Data, __Meta0),
+        ((fun() ->
+              try
+                  __Meta = case get(hut_process_metadata) of
+                             __Map when is_map(__Map) ->
+                                 maps:merge(__Map, __Meta0);
+                             _ ->
+                                 __Meta0
+                           end,
+                  ?log(__Level, "~p", [__Data], [__Meta])
+              catch
+                _:_ ->
+                    ok
+              end
+          end)())).
+
+-define(slog(__Level, __Data, __Meta),
+        ?__hut_slog_helper(__Level, __Data, maps:merge(?__hut_logger_metadata, __Meta))).
+
+-define(slog(__Level, __Data),
+        ?slog(__Level, __Data, #{})).
+
+-endif. %% !slog
+
+-ifndef(set_process_metadata).
+-define(set_process_metadata(__Meta),
+        put(hut_process_metadata, __Meta)).
+-endif. %% !set_process_metadata
+
+% End of log declarations
+-endif. %% __HUT_HRL__