-module(spruce@line). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spruce/line.gleam"). -export([new/1, timestamp/2, scope/2, severity/2, severity_formatter/2, details/2, render/2]). -export_type([line/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( " Compact single-line message composition.\n" "\n" " A `Line` wraps a main message with an optional timestamp, severity, scope,\n" " and key-value details, rendered to one styled line via `render`. Build one\n" " with `new` and the combinators in this module.\n" ). -opaque line() :: {line, binary(), gleam@option:option(binary()), gleam@option:option(binary()), gleam@option:option(spruce@severity:severity()), spruce@severity:formatter(), gleam@option:option(spruce@details:details())}. -file("src/spruce/line.gleam", 29). ?DOC(" Start a compact line with the main message text.\n"). -spec new(binary()) -> line(). new(Text) -> {line, Text, none, none, none, spruce@severity:label(), none}. -file("src/spruce/line.gleam", 41). ?DOC(" Add a timestamp prefix.\n"). -spec timestamp(line(), binary()) -> line(). timestamp(Line, Timestamp) -> {line, erlang:element(2, Line), {some, Timestamp}, erlang:element(4, Line), erlang:element(5, Line), erlang:element(6, Line), erlang:element(7, Line)}. -file("src/spruce/line.gleam", 46). ?DOC(" Add a dim `[scope]` prefix.\n"). -spec scope(line(), binary()) -> line(). scope(Line, Scope) -> {line, erlang:element(2, Line), erlang:element(3, Line), {some, Scope}, erlang:element(5, Line), erlang:element(6, Line), erlang:element(7, Line)}. -file("src/spruce/line.gleam", 51). ?DOC(" Add a generic severity/status prefix.\n"). -spec severity(line(), spruce@severity:severity()) -> line(). severity(Line, Severity) -> {line, erlang:element(2, Line), erlang:element(3, Line), erlang:element(4, Line), {some, Severity}, erlang:element(6, Line), erlang:element(7, Line)}. -file("src/spruce/line.gleam", 56). ?DOC(" Override the severity formatter.\n"). -spec severity_formatter(line(), spruce@severity:formatter()) -> line(). severity_formatter(Line, Formatter) -> {line, erlang:element(2, Line), erlang:element(3, Line), erlang:element(4, Line), erlang:element(5, Line), Formatter, erlang:element(7, Line)}. -file("src/spruce/line.gleam", 64). ?DOC(" Add key-value details after the main text.\n"). -spec details(line(), spruce@details:details()) -> line(). details(Line, Details) -> {line, erlang:element(2, Line), erlang:element(3, Line), erlang:element(4, Line), erlang:element(5, Line), erlang:element(6, Line), {some, Details}}. -file("src/spruce/line.gleam", 122). -spec render_details_part( spruce:spruce(), gleam@option:option(spruce@details:details()) ) -> binary(). render_details_part(Sp, Details_option) -> case Details_option of none -> <<""/utf8>>; {some, Details} -> case spruce@details:render(Sp, Details) of <<""/utf8>> -> <<""/utf8>>; Rendered -> <<" "/utf8, (spruce@style:render( Sp, begin _pipe = spruce@style:new(), spruce@style:dim(_pipe) end, Rendered ))/binary>> end end. -file("src/spruce/line.gleam", 102). -spec render_scope(spruce:spruce(), gleam@option:option(binary())) -> gleam@option:option(binary()). render_scope(Sp, Scope) -> case Scope of none -> none; {some, Scope@1} -> {some, spruce@style:render( Sp, begin _pipe = spruce@style:new(), spruce@style:dim(_pipe) end, <<<<"["/utf8, Scope@1/binary>>/binary, "]"/utf8>> )} end. -file("src/spruce/line.gleam", 86). -spec maybe_append(list(binary()), gleam@option:option(binary())) -> list(binary()). maybe_append(Items, Item) -> case Item of none -> Items; {some, <<""/utf8>>} -> Items; {some, Item@1} -> [Item@1 | Items] end. -file("src/spruce/line.gleam", 110). -spec render_severity( spruce:spruce(), gleam@option:option(spruce@severity:severity()), spruce@severity:formatter() ) -> gleam@option:option(binary()). render_severity(Sp, Severity_value, Formatter) -> case Severity_value of none -> none; {some, Severity_value@1} -> {some, spruce@severity:render_padded(Sp, Formatter, Severity_value@1)} end. -file("src/spruce/line.gleam", 94). -spec render_timestamp(spruce:spruce(), gleam@option:option(binary())) -> gleam@option:option(binary()). render_timestamp(Sp, Timestamp) -> case Timestamp of none -> none; {some, Timestamp@1} -> {some, spruce@style:render( Sp, begin _pipe = spruce@style:new(), spruce@style:dim(_pipe) end, Timestamp@1 )} end. -file("src/spruce/line.gleam", 69). ?DOC(" Render the compact line.\n"). -spec render(spruce:spruce(), line()) -> binary(). render(Sp, Line) -> Prefix = spruce@internal@layout:indent_prefix(Sp), Prefix_parts = begin _pipe = [], _pipe@1 = maybe_append( _pipe, render_timestamp(Sp, erlang:element(3, Line)) ), _pipe@2 = maybe_append( _pipe@1, render_severity( Sp, erlang:element(5, Line), erlang:element(6, Line) ) ), _pipe@3 = maybe_append( _pipe@2, render_scope(Sp, erlang:element(4, Line)) ), lists:reverse(_pipe@3) end, Head = case Prefix_parts of [] -> erlang:element(2, Line); _ -> <<<<(gleam@string:join(Prefix_parts, <<" "/utf8>>))/binary, " "/utf8>>/binary, (erlang:element(2, Line))/binary>> end, <<<>/binary, (render_details_part(Sp, erlang:element(7, Line)))/binary>>.