-module(spruce@severity).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/spruce/severity.gleam").
-export([label/0, badge/0, simple/0, custom/2, icons/2, mode/2, target_width/1, to_string/1, to_string_lowercase/1, render/3, render_padded/3, to_int/1]).
-export_type([severity/0, formatter/0, format_kind/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" Generic Birch-style severity/status formatting.\n").
-type severity() :: trace |
debug |
info |
notice |
warn |
err |
critical |
alert |
fatal.
-opaque formatter() :: {formatter,
format_kind(),
boolean(),
spruce@symbol:mode(),
integer()}.
-type format_kind() :: label |
badge |
simple |
{custom, fun((severity(), spruce:spruce()) -> binary())}.
-file("src/spruce/severity.gleam", 38).
?DOC(" Render an icon plus lowercase severity label, e.g. `ℹ info`.\n").
-spec label() -> formatter().
label() ->
{formatter, label, true, unicode, 10}.
-file("src/spruce/severity.gleam", 43).
?DOC(" Render an uppercase bracketed severity badge, e.g. `[WARN]`.\n").
-spec badge() -> formatter().
badge() ->
{formatter, badge, false, unicode, 10}.
-file("src/spruce/severity.gleam", 48).
?DOC(" Render an uppercase severity name, e.g. `DEBUG`.\n").
-spec simple() -> formatter().
simple() ->
{formatter, simple, false, unicode, 8}.
-file("src/spruce/severity.gleam", 53).
?DOC(" Render severities with a caller-supplied function.\n").
-spec custom(fun((severity(), spruce:spruce()) -> binary()), integer()) -> formatter().
custom(Render, Target_width) ->
{formatter, {custom, Render}, false, unicode, Target_width}.
-file("src/spruce/severity.gleam", 206).
-spec bool_width(boolean()) -> integer().
bool_width(Enabled) ->
gleam@bool:guard(Enabled, 10, fun() -> 8 end).
-file("src/spruce/severity.gleam", 66).
?DOC(" Enable or disable icons for formatters that support them.\n").
-spec icons(formatter(), boolean()) -> formatter().
icons(Formatter, Enabled) ->
case erlang:element(2, Formatter) of
label ->
{formatter,
erlang:element(2, Formatter),
Enabled,
erlang:element(4, Formatter),
bool_width(Enabled)};
_ ->
{formatter,
erlang:element(2, Formatter),
Enabled,
erlang:element(4, Formatter),
erlang:element(5, Formatter)}
end.
-file("src/spruce/severity.gleam", 75).
?DOC(" Set the glyph mode used by icon-bearing formatters.\n").
-spec mode(formatter(), spruce@symbol:mode()) -> formatter().
mode(Formatter, Mode) ->
{formatter,
erlang:element(2, Formatter),
erlang:element(3, Formatter),
Mode,
erlang:element(5, Formatter)}.
-file("src/spruce/severity.gleam", 80).
?DOC(" Return the visual target width used by `render_padded`.\n").
-spec target_width(formatter()) -> integer().
target_width(Formatter) ->
erlang:element(5, Formatter).
-file("src/spruce/severity.gleam", 120).
?DOC(" Convert a severity to its uppercase label.\n").
-spec to_string(severity()) -> binary().
to_string(Severity) ->
case Severity of
trace ->
<<"TRACE"/utf8>>;
debug ->
<<"DEBUG"/utf8>>;
info ->
<<"INFO"/utf8>>;
notice ->
<<"NOTICE"/utf8>>;
warn ->
<<"WARN"/utf8>>;
err ->
<<"ERROR"/utf8>>;
critical ->
<<"CRITICAL"/utf8>>;
alert ->
<<"ALERT"/utf8>>;
fatal ->
<<"FATAL"/utf8>>
end.
-file("src/spruce/severity.gleam", 192).
-spec label_color(severity()) -> spruce@style:color().
label_color(Severity) ->
case Severity of
trace ->
gray;
debug ->
gray;
info ->
cyan;
notice ->
cyan;
warn ->
yellow;
err ->
red;
critical ->
bright_red;
alert ->
bright_red;
fatal ->
bright_red
end.
-file("src/spruce/severity.gleam", 211).
-spec simple_color(severity()) -> spruce@style:color().
simple_color(Severity) ->
case Severity of
debug ->
blue;
_ ->
label_color(Severity)
end.
-file("src/spruce/severity.gleam", 170).
-spec render_simple(spruce:spruce(), severity()) -> binary().
render_simple(Sp, Severity) ->
spruce@style:render(
Sp,
begin
_pipe = spruce@style:new(),
spruce@style:fg(_pipe, simple_color(Severity))
end,
to_string(Severity)
).
-file("src/spruce/severity.gleam", 161).
-spec render_badge(spruce:spruce(), severity()) -> binary().
render_badge(Sp, Severity) ->
Text = <<<<"["/utf8, (to_string(Severity))/binary>>/binary, "]"/utf8>>,
spruce@style:render(
Sp,
begin
_pipe = spruce@style:new(),
_pipe@1 = spruce@style:bold(_pipe),
spruce@style:fg(_pipe@1, label_color(Severity))
end,
Text
).
-file("src/spruce/severity.gleam", 178).
-spec status(severity()) -> spruce@symbol:status().
status(Severity) ->
case Severity of
trace ->
trace;
debug ->
debug;
info ->
info;
notice ->
notice;
warn ->
warn;
err ->
error;
critical ->
error;
alert ->
alert;
fatal ->
error
end.
-file("src/spruce/severity.gleam", 135).
?DOC(" Convert a severity to its lowercase label.\n").
-spec to_string_lowercase(severity()) -> binary().
to_string_lowercase(Severity) ->
_pipe = Severity,
_pipe@1 = to_string(_pipe),
string:lowercase(_pipe@1).
-file("src/spruce/severity.gleam", 141).
-spec render_label(spruce:spruce(), formatter(), severity()) -> binary().
render_label(Sp, Formatter, Severity) ->
Text = to_string_lowercase(Severity),
Color = label_color(Severity),
Label_style = begin
_pipe = spruce@style:new(),
_pipe@1 = spruce@style:bold(_pipe),
spruce@style:fg(_pipe@1, Color)
end,
Styled_text = spruce@style:render(Sp, Label_style, Text),
case erlang:element(3, Formatter) of
false ->
Styled_text;
true ->
Icon = spruce@symbol:status(
erlang:element(4, Formatter),
status(Severity)
),
Styled_icon = spruce@style:render(Sp, Label_style, Icon),
<<<<Styled_icon/binary, " "/utf8>>/binary, Styled_text/binary>>
end.
-file("src/spruce/severity.gleam", 85).
?DOC(" Render a severity with the supplied formatter.\n").
-spec render(spruce:spruce(), formatter(), severity()) -> binary().
render(Sp, Formatter, Severity) ->
case erlang:element(2, Formatter) of
label ->
render_label(Sp, Formatter, Severity);
badge ->
render_badge(Sp, Severity);
simple ->
render_simple(Sp, Severity);
{custom, Render} ->
Render(Severity, Sp)
end.
-file("src/spruce/severity.gleam", 95).
?DOC(" Render a severity and pad it to the formatter's visual target width.\n").
-spec render_padded(spruce:spruce(), formatter(), severity()) -> binary().
render_padded(Sp, Formatter, Severity) ->
_pipe = render(Sp, Formatter, Severity),
spruce@align:pad_right(_pipe, erlang:element(5, Formatter)).
-file("src/spruce/severity.gleam", 105).
?DOC(" Convert a severity to its Birch ordering integer.\n").
-spec to_int(severity()) -> integer().
to_int(Severity) ->
case Severity of
trace ->
0;
debug ->
1;
info ->
2;
notice ->
3;
warn ->
4;
err ->
5;
critical ->
6;
alert ->
7;
fatal ->
8
end.