src/gliff@internal@ansi.erl

-module(gliff@internal@ansi).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gliff/internal/ansi.gleam").
-export([to_ansi/3, to_ansi_inline/1]).

-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(false).

-file("src/gliff/internal/ansi.gleam", 117).
?DOC(false).
-spec digit_to_string(integer()) -> binary().
digit_to_string(D) ->
    case D of
        0 ->
            <<"0"/utf8>>;

        1 ->
            <<"1"/utf8>>;

        2 ->
            <<"2"/utf8>>;

        3 ->
            <<"3"/utf8>>;

        4 ->
            <<"4"/utf8>>;

        5 ->
            <<"5"/utf8>>;

        6 ->
            <<"6"/utf8>>;

        7 ->
            <<"7"/utf8>>;

        8 ->
            <<"8"/utf8>>;

        _ ->
            <<"9"/utf8>>
    end.

-file("src/gliff/internal/ansi.gleam", 110).
?DOC(false).
-spec do_int_to_string(integer()) -> binary().
do_int_to_string(N) ->
    case N < 10 of
        true ->
            digit_to_string(N);

        false ->
            <<(do_int_to_string(N div 10))/binary,
                (digit_to_string(N rem 10))/binary>>
    end.

-file("src/gliff/internal/ansi.gleam", 103).
?DOC(false).
-spec int_to_string(integer()) -> binary().
int_to_string(N) ->
    case N < 0 of
        true ->
            <<"-"/utf8, (do_int_to_string(- N))/binary>>;

        false ->
            do_int_to_string(N)
    end.

-file("src/gliff/internal/ansi.gleam", 64).
?DOC(false).
-spec format_edit_ansi(gliff@types:edit()) -> binary().
format_edit_ansi(Edit) ->
    case Edit of
        {equal, Lines} ->
            gleam@string:join(
                gleam@list:map(
                    Lines,
                    fun(L) -> <<<<" "/utf8, L/binary>>/binary, "\n"/utf8>> end
                ),
                <<""/utf8>>
            );

        {delete, Lines@1} ->
            gleam@string:join(
                gleam@list:map(
                    Lines@1,
                    fun(L@1) ->
                        <<<<<<<<"\x{001b}[31m"/utf8, "-"/utf8>>/binary,
                                    L@1/binary>>/binary,
                                "\x{001b}[0m"/utf8>>/binary,
                            "\n"/utf8>>
                    end
                ),
                <<""/utf8>>
            );

        {insert, Lines@2} ->
            gleam@string:join(
                gleam@list:map(
                    Lines@2,
                    fun(L@2) ->
                        <<<<<<<<"\x{001b}[32m"/utf8, "+"/utf8>>/binary,
                                    L@2/binary>>/binary,
                                "\x{001b}[0m"/utf8>>/binary,
                            "\n"/utf8>>
                    end
                ),
                <<""/utf8>>
            )
    end.

-file("src/gliff/internal/ansi.gleam", 46).
?DOC(false).
-spec format_hunk_ansi(gliff@types:hunk()) -> binary().
format_hunk_ansi(Hunk) ->
    Header = <<<<<<<<<<<<<<<<<<<<<<"\x{001b}[36m"/utf8, "@@ -"/utf8>>/binary,
                                            (int_to_string(
                                                erlang:element(2, Hunk)
                                            ))/binary>>/binary,
                                        ","/utf8>>/binary,
                                    (int_to_string(erlang:element(3, Hunk)))/binary>>/binary,
                                " +"/utf8>>/binary,
                            (int_to_string(erlang:element(4, Hunk)))/binary>>/binary,
                        ","/utf8>>/binary,
                    (int_to_string(erlang:element(5, Hunk)))/binary>>/binary,
                " @@"/utf8>>/binary,
            "\x{001b}[0m"/utf8>>/binary,
        "\n"/utf8>>,
    Body = gleam@string:join(
        gleam@list:map(erlang:element(6, Hunk), fun format_edit_ansi/1),
        <<""/utf8>>
    ),
    <<Header/binary, Body/binary>>.

-file("src/gliff/internal/ansi.gleam", 20).
?DOC(false).
-spec to_ansi(list(gliff@types:edit()), binary(), binary()) -> binary().
to_ansi(Edits, Old_name, New_name) ->
    Hunks = gliff@internal@unified:edits_to_hunks(Edits, 3),
    Header = <<<<<<<<<<<<<<<<<<"\x{001b}[1m"/utf8, "--- "/utf8>>/binary,
                                    Old_name/binary>>/binary,
                                "\x{001b}[0m"/utf8>>/binary,
                            "\n"/utf8>>/binary,
                        "\x{001b}[1m"/utf8>>/binary,
                    "+++ "/utf8>>/binary,
                New_name/binary>>/binary,
            "\x{001b}[0m"/utf8>>/binary,
        "\n"/utf8>>,
    Body = gleam@string:join(
        gleam@list:map(Hunks, fun format_hunk_ansi/1),
        <<""/utf8>>
    ),
    <<Header/binary, Body/binary>>.

-file("src/gliff/internal/ansi.gleam", 91).
?DOC(false).
-spec format_spans(list(gliff@types:span()), binary()) -> binary().
format_spans(Spans, Base_color) ->
    gleam@string:join(gleam@list:map(Spans, fun(Span) -> case Span of
                    {unchanged, Text} ->
                        Text;

                    {changed, Text@1} ->
                        <<<<<<"\x{001b}[1m"/utf8, Text@1/binary>>/binary,
                                "\x{001b}[0m"/utf8>>/binary,
                            Base_color/binary>>
                end end), <<""/utf8>>).

-file("src/gliff/internal/ansi.gleam", 80).
?DOC(false).
-spec format_inline_edit(gliff@types:inline_edit()) -> binary().
format_inline_edit(Edit) ->
    case Edit of
        {inline_equal, Lines} ->
            gleam@string:join(
                gleam@list:map(
                    Lines,
                    fun(L) -> <<<<" "/utf8, L/binary>>/binary, "\n"/utf8>> end
                ),
                <<""/utf8>>
            );

        {inline_delete, Spans} ->
            <<<<<<<<"\x{001b}[31m"/utf8, "-"/utf8>>/binary,
                        (format_spans(Spans, <<"\x{001b}[31m"/utf8>>))/binary>>/binary,
                    "\x{001b}[0m"/utf8>>/binary,
                "\n"/utf8>>;

        {inline_insert, Spans@1} ->
            <<<<<<<<"\x{001b}[32m"/utf8, "+"/utf8>>/binary,
                        (format_spans(Spans@1, <<"\x{001b}[32m"/utf8>>))/binary>>/binary,
                    "\x{001b}[0m"/utf8>>/binary,
                "\n"/utf8>>
    end.

-file("src/gliff/internal/ansi.gleam", 41).
?DOC(false).
-spec to_ansi_inline(list(gliff@types:edit())) -> binary().
to_ansi_inline(Edits) ->
    Inline_edits = gliff@internal@inline:highlight(Edits),
    gleam@string:join(
        gleam@list:map(Inline_edits, fun format_inline_edit/1),
        <<""/utf8>>
    ).