src/gleeam_code@internal@resolver.erl

-module(gleeam_code@internal@resolver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gleeam_code/internal/resolver.gleam").
-export([is_numeric/1, resolve_module/2]).

-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/gleeam_code/internal/resolver.gleam", 28).
?DOC(false).
-spec is_numeric(binary()) -> boolean().
is_numeric(S) ->
    case gleam@string:to_graphemes(S) of
        [] ->
            false;

        Chars ->
            gleam@list:all(Chars, fun gleeam_code@internal@char:is_digit/1)
    end.

-file("src/gleeam_code/internal/resolver.gleam", 46).
?DOC(false).
-spec find_by_number(list(binary()), binary()) -> {ok, binary()} | {error, nil}.
find_by_number(Entries, Number) ->
    Padded = gleam@string:pad_start(Number, 4, <<"0"/utf8>>),
    gleam@list:find(
        Entries,
        fun(Entry) ->
            gleam_stdlib:string_starts_with(
                Entry,
                <<<<"p"/utf8, Padded/binary>>/binary, "_"/utf8>>
            )
        end
    ).

-file("src/gleeam_code/internal/resolver.gleam", 53).
?DOC(false).
-spec find_by_slug(list(binary()), binary()) -> {ok, binary()} | {error, nil}.
find_by_slug(Entries, Snake_slug) ->
    gleam@list:find(
        Entries,
        fun(Entry) -> case gleam@string:split_once(Entry, <<"_"/utf8>>) of
                {ok, {_, Slug_part}} ->
                    Slug_part =:= Snake_slug;

                {error, _} ->
                    false
            end end
    ).

-file("src/gleeam_code/internal/resolver.gleam", 35).
?DOC(false).
-spec find_matching_entry(list(binary()), binary()) -> {ok, binary()} |
    {error, nil}.
find_matching_entry(Entries, Target) ->
    Snake_target = gleam@string:replace(Target, <<"-"/utf8>>, <<"_"/utf8>>),
    case is_numeric(Target) of
        true ->
            find_by_number(Entries, Target);

        false ->
            find_by_slug(Entries, Snake_target)
    end.

-file("src/gleeam_code/internal/resolver.gleam", 65).
?DOC(false).
-spec list_directory(binary()) -> {ok, list(binary())} | {error, nil}.
list_directory(Path) ->
    case gleeam_code@internal@file:dir_exists(Path) of
        false ->
            {error, nil};

        true ->
            case gleeam_code@internal@file:list_directory(Path) of
                {ok, Entries} ->
                    {ok, Entries};

                {error, _} ->
                    {error, nil}
            end
    end.

-file("src/gleeam_code/internal/resolver.gleam", 6).
?DOC(false).
-spec resolve_module(binary(), binary()) -> {ok, binary()} | {error, binary()}.
resolve_module(Base_dir, Target) ->
    Test_solutions_dir = <<Base_dir/binary, "/test/solutions"/utf8>>,
    case list_directory(Test_solutions_dir) of
        {error, _} ->
            {error, <<"No solutions found. Run 'glc fetch' first."/utf8>>};

        {ok, Entries} ->
            case find_matching_entry(Entries, Target) of
                {ok, Name} ->
                    {ok, Name};

                {error, _} ->
                    {error,
                        <<<<<<<<"Problem not found: "/utf8, Target/binary>>/binary,
                                    ". Run 'glc fetch "/utf8>>/binary,
                                Target/binary>>/binary,
                            "' first."/utf8>>}
            end
    end.