Current section
Files
Jump to
Current section
Files
src/glimt.erl
-module(glimt).
-compile(no_auto_import).
-export([new/1, level/2, with_context/2, get_context/1, with_time_provider/2, new_stdout/1, append_instance/2, stdout_instance/2, stdout_anonymous_instance/1, start_instance/3, debug/2, info/2, warning/2, trace/2, error/3, fatal/3, log/3, log_with_data/4, log_error_with_data/5]).
-export_type([logger/2, logger_instance/2]).
-opaque logger(HND, HNE) :: {logger,
binary(),
integer(),
fun(() -> binary()),
gleam@option:option(HNE),
list(logger_instance(HND, HNE))}.
-type logger_instance(HNL, HNM) :: {direct,
gleam@option:option(binary()),
integer(),
fun((glimt@log_message:log_message(HNL, HNM, gleam@dynamic:dynamic())) -> nil)} |
{actor,
gleam@option:option(binary()),
integer(),
gleam@erlang@process:subject(glimt@log_message:log_message(HNL, HNM, gleam@dynamic:dynamic()))}.
-spec new(binary()) -> logger(any(), any()).
new(Name) ->
{logger, Name, glimt@log_message:level_value(all), fun now_iso/0, none, []}.
-spec level(logger(HOJ, HOK), glimt@log_message:log_level()) -> logger(HOJ, HOK).
level(Logger, Level) ->
erlang:setelement(3, Logger, glimt@log_message:level_value(Level)).
-spec with_context(logger(HOP, HOQ), HOQ) -> logger(HOP, HOQ).
with_context(Logger, Context) ->
erlang:setelement(5, Logger, {some, Context}).
-spec get_context(logger(any(), HOV)) -> gleam@option:option(HOV).
get_context(Logger) ->
erlang:element(5, Logger).
-spec with_time_provider(logger(HOZ, HPA), fun(() -> binary())) -> logger(HOZ, HPA).
with_time_provider(Logger, Time_provider) ->
erlang:setelement(4, Logger, Time_provider).
-spec new_stdout(binary()) -> logger(nil, {binary(), binary()}).
new_stdout(Name) ->
_pipe = new(Name),
append_instance(_pipe, stdout_anonymous_instance(all)).
-spec append_instance(logger(HPG, HPH), logger_instance(HPG, HPH)) -> logger(HPG, HPH).
append_instance(Logger, Instance) ->
erlang:setelement(6, Logger, [Instance | erlang:element(6, Logger)]).
-spec stdout_instance(binary(), glimt@log_message:log_level()) -> logger_instance(any(), any()).
stdout_instance(Name, Level) ->
{direct,
{some, Name},
glimt@log_message:level_value(Level),
glimt@dispatcher@stdout:dispatcher(
fun glimt@serializer@basic:basic_serializer/1
)}.
-spec stdout_anonymous_instance(glimt@log_message:log_level()) -> logger_instance(any(), any()).
stdout_anonymous_instance(Level) ->
{direct,
none,
glimt@log_message:level_value(Level),
glimt@dispatcher@stdout:dispatcher(
fun glimt@serializer@basic:basic_serializer/1
)}.
-spec start_instance(
binary(),
glimt@log_message:log_level(),
fun((glimt@log_message:log_message(HPW, HPX, any())) -> nil)
) -> {ok, logger_instance(HPW, HPX)} | {error, gleam@otp@actor:start_error()}.
start_instance(Name, Level, Dispatch) ->
_pipe = start_logger_actor(Dispatch),
gleam@result:map(
_pipe,
fun(Subject) ->
{actor, {some, Name}, glimt@log_message:level_value(Level), Subject}
end
).
-spec start_logger_actor(
fun((glimt@log_message:log_message(any(), any(), any())) -> nil)
) -> {ok,
gleam@erlang@process:subject(glimt@log_message:log_message(any(), any(), gleam@dynamic:dynamic()))} |
{error, gleam@otp@actor:start_error()}.
start_logger_actor(Dispatch) ->
gleam@otp@actor:start(
Dispatch,
fun(Message, Dispatch@1) ->
case Message of
{log_message,
_@1,
_@2,
_@3,
_@4,
_@5,
_@6,
_@7,
_@8,
_@9,
_@10,
_@11} ->
Dispatch@1(
erlang:setelement(6, Message, {some, erlang:self()})
);
_@12 ->
nil
end,
{continue, Dispatch@1}
end
).
-spec debug(logger(HQP, HQQ), binary()) -> logger(HQP, HQQ).
debug(Logger, Message) ->
Log_message = mk_message(Logger, debug, Message),
dispatch_log(Logger, Log_message),
Logger.
-spec info(logger(HQV, HQW), binary()) -> logger(HQV, HQW).
info(Logger, Message) ->
Log_message = mk_message(Logger, info, Message),
dispatch_log(Logger, Log_message),
Logger.
-spec warning(logger(HRB, HRC), binary()) -> logger(HRB, HRC).
warning(Logger, Message) ->
Log_message = mk_message(Logger, warning, Message),
dispatch_log(Logger, Log_message),
Logger.
-spec trace(logger(HRH, HRI), binary()) -> logger(HRH, HRI).
trace(Logger, Message) ->
Log_message = mk_message(Logger, trace, Message),
dispatch_log(Logger, Log_message),
Logger.
-spec error(logger(HRN, HRO), binary(), {ok, any()} | {error, any()}) -> logger(HRN, HRO).
error(Logger, Message, Error) ->
Log_message = mk_error_message(Logger, error, Message, Error),
dispatch_log(Logger, Log_message),
Logger.
-spec fatal(logger(HRX, HRY), binary(), {ok, any()} | {error, any()}) -> logger(HRX, HRY).
fatal(Logger, Message, Error) ->
Log_message = mk_error_message(Logger, fatal, Message, Error),
dispatch_log(Logger, Log_message),
Logger.
-spec log(logger(HSH, HSI), glimt@log_message:log_level(), binary()) -> logger(HSH, HSI).
log(Logger, Level, Message) ->
Log_message = mk_message(Logger, Level, Message),
dispatch_log(Logger, Log_message),
Logger.
-spec log_with_data(
logger(HSN, HSO),
glimt@log_message:log_level(),
binary(),
HSN
) -> logger(HSN, HSO).
log_with_data(Logger, Level, Message, Data) ->
dispatch_log(
Logger,
{log_message,
(erlang:element(4, Logger))(),
erlang:element(2, Logger),
erlang:self(),
none,
none,
Level,
glimt@log_message:level_value(Level),
Message,
none,
{some, Data},
erlang:element(5, Logger)}
),
Logger.
-spec log_error_with_data(
logger(HST, HSU),
glimt@log_message:log_level(),
binary(),
{ok, any()} | {error, any()},
HST
) -> logger(HST, HSU).
log_error_with_data(Logger, Level, Message, Error, Data) ->
Dynamic_result = case Error of
{ok, A} ->
{some, {ok, gleam@dynamic:from(A)}};
{error, A@1} ->
{some, {error, gleam@dynamic:from(A@1)}}
end,
dispatch_log(
Logger,
{log_message,
(erlang:element(4, Logger))(),
erlang:element(2, Logger),
erlang:self(),
none,
none,
Level,
glimt@log_message:level_value(Level),
Message,
Dynamic_result,
{some, Data},
erlang:element(5, Logger)}
),
Logger.
-spec mk_message(logger(HTD, HTE), glimt@log_message:log_level(), binary()) -> glimt@log_message:log_message(HTD, HTE, gleam@dynamic:dynamic()).
mk_message(Logger, Level, Message) ->
{log_message,
(erlang:element(4, Logger))(),
erlang:element(2, Logger),
erlang:self(),
none,
none,
Level,
glimt@log_message:level_value(Level),
Message,
none,
none,
erlang:element(5, Logger)}.
-spec mk_error_message(
logger(HTK, HTL),
glimt@log_message:log_level(),
binary(),
{ok, any()} | {error, any()}
) -> glimt@log_message:log_message(HTK, HTL, gleam@dynamic:dynamic()).
mk_error_message(Logger, Level, Message, Error) ->
Dynamic_result = case Error of
{ok, A} ->
{some, {ok, gleam@dynamic:from(A)}};
{error, A@1} ->
{some, {error, gleam@dynamic:from(A@1)}}
end,
{log_message,
(erlang:element(4, Logger))(),
erlang:element(2, Logger),
erlang:self(),
none,
none,
Level,
glimt@log_message:level_value(Level),
Message,
Dynamic_result,
none,
erlang:element(5, Logger)}.
-spec dispatch_log(
logger(HTV, HTW),
glimt@log_message:log_message(HTV, HTW, gleam@dynamic:dynamic())
) -> nil.
dispatch_log(Logger, Log_message) ->
{log_message,
_@1,
_@2,
_@3,
_@4,
_@5,
_@6,
Level_value,
_@7,
_@8,
_@9,
_@10} = Log_message,
_pipe = erlang:element(6, Logger),
gleam@list:each(
_pipe,
fun(Impl) ->
case erlang:element(8, Log_message) >= erlang:element(3, Logger) of
true ->
case Impl of
{direct, Instance_name, Level_min_value, Dispatch} when Level_value >= Level_min_value ->
Dispatch(
erlang:setelement(5, Log_message, Instance_name)
);
{actor, Instance_name@1, Level_min_value@1, Subject} when Level_value >= Level_min_value@1 ->
_pipe@1 = Subject,
gleam@erlang@process:send(
_pipe@1,
erlang:setelement(
5,
Log_message,
Instance_name@1
)
);
_@11 ->
nil
end;
_@12 ->
nil
end
end
).
-spec now_iso() -> binary().
now_iso() ->
_pipe = birl@datetime:now(),
birl@datetime:to_iso(_pipe).