-module(spruce@message).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/spruce/message.gleam").
-export([default_options/0, with_details/2, with_symbol_mode/2, label/0, badge/0, simple/0, custom/1, with_formatter/2, success/2, success_with/3, fail/2, fail_with/3, start/2, start_with/3, ready/2, ready_with/3, info/2, info_with/3, warn/2, warn_with/3, error/2, error_with/3, print_success/2, print_fail/2, print_start/2, print_ready/2, print_info/2, print_warn/2, print_error/2, line_with/4]).
-export_type([kind/0, options/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(
" Semantic one-line messages: success, fail, start, ready, info, warn, error.\n"
"\n"
" Each function returns a formatted line (icon + label + text), indented to\n"
" the context's depth and styled when the context supports color. The\n"
" `print_*` variants write the line to stdout.\n"
).
-type kind() :: success | fail | start | ready | info | warn | error.
-opaque options() :: {options,
gleam@option:option(spruce@details:details()),
spruce@symbol:mode(),
gleam@option:option(formatter())}.
-opaque formatter() :: {formatter, format_kind()}.
-type format_kind() :: label |
badge |
simple |
{custom, fun((kind(), spruce:spruce()) -> binary())}.
-file("src/spruce/message.gleam", 48).
?DOC(" Create default message rendering options.\n").
-spec default_options() -> options().
default_options() ->
{options, none, unicode, none}.
-file("src/spruce/message.gleam", 53).
?DOC(" Include key-value details after the message text.\n").
-spec with_details(options(), spruce@details:details()) -> options().
with_details(Options, Details) ->
{options,
{some, Details},
erlang:element(3, Options),
erlang:element(4, Options)}.
-file("src/spruce/message.gleam", 58).
?DOC(" Select whether message status glyphs render as Unicode or ASCII.\n").
-spec with_symbol_mode(options(), spruce@symbol:mode()) -> options().
with_symbol_mode(Options, Mode) ->
{options, erlang:element(2, Options), Mode, erlang:element(4, Options)}.
-file("src/spruce/message.gleam", 63).
?DOC(" Render the message prefix as icon plus lowercase label, e.g. `✔ success`.\n").
-spec label() -> formatter().
label() ->
{formatter, label}.
-file("src/spruce/message.gleam", 68).
?DOC(" Render the message prefix as an uppercase bracketed badge, e.g. `[SUCCESS]`.\n").
-spec badge() -> formatter().
badge() ->
{formatter, badge}.
-file("src/spruce/message.gleam", 73).
?DOC(" Render the message prefix as an uppercase bare label, e.g. `SUCCESS`.\n").
-spec simple() -> formatter().
simple() ->
{formatter, simple}.
-file("src/spruce/message.gleam", 78).
?DOC(" Render the message prefix with a caller-supplied function.\n").
-spec custom(fun((kind(), spruce:spruce()) -> binary())) -> formatter().
custom(Render) ->
{formatter, {custom, Render}}.
-file("src/spruce/message.gleam", 83).
?DOC(" Select a message prefix formatter.\n").
-spec with_formatter(options(), formatter()) -> options().
with_formatter(Options, Formatter) ->
{options,
erlang:element(2, Options),
erlang:element(3, Options),
{some, Formatter}}.
-file("src/spruce/message.gleam", 270).
-spec details_suffix(
spruce:spruce(),
gleam@option:option(spruce@details:details())
) -> binary().
details_suffix(Sp, Maybe_details) ->
case Maybe_details of
none ->
<<""/utf8>>;
{some, Detail_values} ->
case spruce@details:render(Sp, Detail_values) of
<<""/utf8>> ->
<<""/utf8>>;
Rendered ->
<<" "/utf8, Rendered/binary>>
end
end.
-file("src/spruce/message.gleam", 294).
-spec uppercase(binary()) -> binary().
uppercase(Label) ->
case Label of
<<"success"/utf8>> ->
<<"SUCCESS"/utf8>>;
<<"fail"/utf8>> ->
<<"FAIL"/utf8>>;
<<"start"/utf8>> ->
<<"START"/utf8>>;
<<"ready"/utf8>> ->
<<"READY"/utf8>>;
<<"info"/utf8>> ->
<<"INFO"/utf8>>;
<<"warn"/utf8>> ->
<<"WARN"/utf8>>;
<<"error"/utf8>> ->
<<"ERROR"/utf8>>;
_ ->
Label
end.
-file("src/spruce/message.gleam", 282).
-spec properties(kind()) -> {spruce@symbol:status(),
spruce@style:color(),
binary()}.
properties(Kind) ->
case Kind of
success ->
{success, green, <<"success"/utf8>>};
fail ->
{error, red, <<"fail"/utf8>>};
start ->
{start, magenta, <<"start"/utf8>>};
ready ->
{success, green, <<"ready"/utf8>>};
info ->
{info, cyan, <<"info"/utf8>>};
warn ->
{warn, yellow, <<"warn"/utf8>>};
error ->
{error, red, <<"error"/utf8>>}
end.
-file("src/spruce/message.gleam", 265).
-spec render_simple(spruce:spruce(), kind()) -> binary().
render_simple(Sp, Kind) ->
{_, Color, Label} = properties(Kind),
spruce@style:render(
Sp,
begin
_pipe = spruce@style:new(),
spruce@style:fg(_pipe, Color)
end,
uppercase(Label)
).
-file("src/spruce/message.gleam", 256).
-spec render_badge(spruce:spruce(), kind()) -> binary().
render_badge(Sp, Kind) ->
{_, Color, Label} = properties(Kind),
spruce@style:render(
Sp,
begin
_pipe = spruce@style:new(),
_pipe@1 = spruce@style:bold(_pipe),
spruce@style:fg(_pipe@1, Color)
end,
<<<<"["/utf8, (uppercase(Label))/binary>>/binary, "]"/utf8>>
).
-file("src/spruce/message.gleam", 223).
-spec render_default_prefix(spruce:spruce(), kind(), spruce@symbol:mode()) -> binary().
render_default_prefix(Sp, Kind, Symbol_mode) ->
{Status, Color, Label} = properties(Kind),
Icon = spruce@symbol:status(Symbol_mode, Status),
case spruce:supports_color(Sp) of
false ->
<<<<Icon/binary, " "/utf8>>/binary, Label/binary>>;
true ->
Colored = begin
_pipe = spruce@style:new(),
spruce@style:fg(_pipe, Color)
end,
<<<<(spruce@style:render(Sp, Colored, Icon))/binary, " "/utf8>>/binary,
(spruce@style:render(Sp, spruce@style:bold(Colored), Label))/binary>>
end.
-file("src/spruce/message.gleam", 242).
-spec render_formatter(
spruce:spruce(),
formatter(),
kind(),
spruce@symbol:mode()
) -> binary().
render_formatter(Sp, Formatter, Kind, Symbol_mode) ->
case erlang:element(2, Formatter) of
label ->
render_default_prefix(Sp, Kind, Symbol_mode);
badge ->
render_badge(Sp, Kind);
simple ->
render_simple(Sp, Kind);
{custom, Render} ->
Render(Kind, Sp)
end.
-file("src/spruce/message.gleam", 206).
-spec line_options(spruce:spruce(), kind(), binary(), options()) -> binary().
line_options(Sp, Kind, Text, Options) ->
Prefix = spruce@internal@layout:indent_prefix(Sp),
Rendered_prefix = case erlang:element(4, Options) of
none ->
render_default_prefix(Sp, Kind, erlang:element(3, Options));
{some, Formatter} ->
render_formatter(Sp, Formatter, Kind, erlang:element(3, Options))
end,
Details_text = details_suffix(Sp, erlang:element(2, Options)),
<<<<<<<<Prefix/binary, Rendered_prefix/binary>>/binary, " "/utf8>>/binary,
Text/binary>>/binary,
Details_text/binary>>.
-file("src/spruce/message.gleam", 202).
-spec line(spruce:spruce(), kind(), binary()) -> binary().
line(Sp, Kind, Text) ->
line_options(Sp, Kind, Text, default_options()).
-file("src/spruce/message.gleam", 88).
?DOC(" Format a success message line.\n").
-spec success(spruce:spruce(), binary()) -> binary().
success(Sp, Text) ->
line(Sp, success, Text).
-file("src/spruce/message.gleam", 93).
?DOC(" Format a success message line with explicit rendering options.\n").
-spec success_with(spruce:spruce(), binary(), options()) -> binary().
success_with(Sp, Text, Options) ->
line_options(Sp, success, Text, Options).
-file("src/spruce/message.gleam", 98).
?DOC(" Format a fail message line.\n").
-spec fail(spruce:spruce(), binary()) -> binary().
fail(Sp, Text) ->
line(Sp, fail, Text).
-file("src/spruce/message.gleam", 103).
?DOC(" Format a fail message line with explicit rendering options.\n").
-spec fail_with(spruce:spruce(), binary(), options()) -> binary().
fail_with(Sp, Text, Options) ->
line_options(Sp, fail, Text, Options).
-file("src/spruce/message.gleam", 108).
?DOC(" Format a start message line.\n").
-spec start(spruce:spruce(), binary()) -> binary().
start(Sp, Text) ->
line(Sp, start, Text).
-file("src/spruce/message.gleam", 113).
?DOC(" Format a start message line with explicit rendering options.\n").
-spec start_with(spruce:spruce(), binary(), options()) -> binary().
start_with(Sp, Text, Options) ->
line_options(Sp, start, Text, Options).
-file("src/spruce/message.gleam", 118).
?DOC(" Format a ready message line.\n").
-spec ready(spruce:spruce(), binary()) -> binary().
ready(Sp, Text) ->
line(Sp, ready, Text).
-file("src/spruce/message.gleam", 123).
?DOC(" Format a ready message line with explicit rendering options.\n").
-spec ready_with(spruce:spruce(), binary(), options()) -> binary().
ready_with(Sp, Text, Options) ->
line_options(Sp, ready, Text, Options).
-file("src/spruce/message.gleam", 128).
?DOC(" Format an info message line.\n").
-spec info(spruce:spruce(), binary()) -> binary().
info(Sp, Text) ->
line(Sp, info, Text).
-file("src/spruce/message.gleam", 133).
?DOC(" Format an info message line with explicit rendering options.\n").
-spec info_with(spruce:spruce(), binary(), options()) -> binary().
info_with(Sp, Text, Options) ->
line_options(Sp, info, Text, Options).
-file("src/spruce/message.gleam", 138).
?DOC(" Format a warn message line.\n").
-spec warn(spruce:spruce(), binary()) -> binary().
warn(Sp, Text) ->
line(Sp, warn, Text).
-file("src/spruce/message.gleam", 143).
?DOC(" Format a warn message line with explicit rendering options.\n").
-spec warn_with(spruce:spruce(), binary(), options()) -> binary().
warn_with(Sp, Text, Options) ->
line_options(Sp, warn, Text, Options).
-file("src/spruce/message.gleam", 148).
?DOC(" Format an error message line.\n").
-spec error(spruce:spruce(), binary()) -> binary().
error(Sp, Text) ->
line(Sp, error, Text).
-file("src/spruce/message.gleam", 153).
?DOC(" Format an error message line with explicit rendering options.\n").
-spec error_with(spruce:spruce(), binary(), options()) -> binary().
error_with(Sp, Text, Options) ->
line_options(Sp, error, Text, Options).
-file("src/spruce/message.gleam", 158).
?DOC(" Print a success message to stdout.\n").
-spec print_success(spruce:spruce(), binary()) -> nil.
print_success(Sp, Text) ->
gleam_stdlib:println(success(Sp, Text)).
-file("src/spruce/message.gleam", 163).
?DOC(" Print a fail message to stdout.\n").
-spec print_fail(spruce:spruce(), binary()) -> nil.
print_fail(Sp, Text) ->
gleam_stdlib:println(fail(Sp, Text)).
-file("src/spruce/message.gleam", 168).
?DOC(" Print a start message to stdout.\n").
-spec print_start(spruce:spruce(), binary()) -> nil.
print_start(Sp, Text) ->
gleam_stdlib:println(start(Sp, Text)).
-file("src/spruce/message.gleam", 173).
?DOC(" Print a ready message to stdout.\n").
-spec print_ready(spruce:spruce(), binary()) -> nil.
print_ready(Sp, Text) ->
gleam_stdlib:println(ready(Sp, Text)).
-file("src/spruce/message.gleam", 178).
?DOC(" Print an info message to stdout.\n").
-spec print_info(spruce:spruce(), binary()) -> nil.
print_info(Sp, Text) ->
gleam_stdlib:println(info(Sp, Text)).
-file("src/spruce/message.gleam", 183).
?DOC(" Print a warn message to stdout.\n").
-spec print_warn(spruce:spruce(), binary()) -> nil.
print_warn(Sp, Text) ->
gleam_stdlib:println(warn(Sp, Text)).
-file("src/spruce/message.gleam", 188).
?DOC(" Print an error message to stdout.\n").
-spec print_error(spruce:spruce(), binary()) -> nil.
print_error(Sp, Text) ->
gleam_stdlib:println(error(Sp, Text)).
-file("src/spruce/message.gleam", 193).
?DOC(" Format a message line with explicit rendering options.\n").
-spec line_with(spruce:spruce(), kind(), binary(), options()) -> binary().
line_with(Sp, Kind, Text, Options) ->
line_options(Sp, Kind, Text, Options).