-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.