Skip to main content

src/kludge@internal@patch.erl

-module(kludge@internal@patch).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/kludge/internal/patch.gleam").
-export([compare_patch/2, parse_patch_name/1]).
-export_type([patch/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(false).

-type patch() :: {patch,
        binary(),
        binary(),
        binary(),
        gleam@option:option(binary())}.

-file("src/kludge/internal/patch.gleam", 8).
?DOC(false).
-spec compare_patch(patch(), patch()) -> gleam@order:order().
compare_patch(Lhs, Rhs) ->
    gleam@order:lazy_break_tie(
        gleam@string:compare(erlang:element(3, Lhs), erlang:element(3, Rhs)),
        fun() ->
            gleam@order:lazy_break_tie(
                gleam@string:compare(
                    erlang:element(4, Lhs),
                    erlang:element(4, Rhs)
                ),
                fun() -> case erlang:element(5, Lhs) of
                        {some, Lhs@1} ->
                            case erlang:element(5, Rhs) of
                                {some, Rhs@1} ->
                                    gleam@string:compare(Lhs@1, Rhs@1);

                                none ->
                                    lt
                            end;

                        none ->
                            case erlang:element(5, Rhs) of
                                {some, _} ->
                                    gt;

                                none ->
                                    eq
                            end
                    end end
            )
        end
    ).

-file("src/kludge/internal/patch.gleam", 28).
?DOC(false).
-spec parse_patch_name(binary()) -> {ok, patch()} | {error, nil}.
parse_patch_name(Path) ->
    gleam@result:'try'(
        begin
            _pipe = Path,
            _pipe@1 = filepath:base_name(_pipe),
            gleam@string:split_once(_pipe@1, <<"+"/utf8>>)
        end,
        fun(_use0) ->
            {Name, End_dot_patch} = _use0,
            gleam@bool:guard(
                not gleam_stdlib:string_ends_with(
                    End_dot_patch,
                    <<".patch"/utf8>>
                ),
                {error, nil},
                fun() ->
                    End = gleam@string:drop_end(End_dot_patch, 6),
                    _pipe@2 = case gleam@string:split_once(End, <<"+"/utf8>>) of
                        {ok, {Version, Ordering}} ->
                            {patch, Path, Name, Version, {some, Ordering}};

                        {error, nil} ->
                            {patch, Path, Name, End, none}
                    end,
                    {ok, _pipe@2}
                end
            )
        end
    ).