Skip to main content

src/spruce@severity.erl

-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.