-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), <<<>/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.