src/glipt@internal@toml.erl

-module(glipt@internal@toml).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glipt/internal/toml.gleam").
-export([generate_runtime_toml/3, generate_project_toml/2, parse_deps/1, parse_gleam_version/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/glipt/internal/toml.gleam", 40).
?DOC(false).
-spec gleam_section(glipt@parser:script_meta()) -> binary().
gleam_section(Meta) ->
    case erlang:element(2, Meta) of
        {ok, Constraint} ->
            <<<<"\n[gleam]\nversion = \""/utf8, Constraint/binary>>/binary,
                "\"\n"/utf8>>;

        {error, nil} ->
            <<""/utf8>>
    end.

-file("src/glipt/internal/toml.gleam", 57).
?DOC(false).
-spec format_dep_lines(list(glipt@parser:dependency())) -> binary().
format_dep_lines(Deps) ->
    Lines = gleam@list:map(Deps, fun(Dep) -> case erlang:element(3, Dep) of
                <<""/utf8>> ->
                    <<(erlang:element(2, Dep))/binary, " = \">= 0.0.0\""/utf8>>;

                C ->
                    case gleam_stdlib:string_starts_with(C, <<"{"/utf8>>) of
                        true ->
                            <<<<(erlang:element(2, Dep))/binary, " = "/utf8>>/binary,
                                C/binary>>;

                        false ->
                            Clean = gleam@string:replace(
                                C,
                                <<"\""/utf8>>,
                                <<""/utf8>>
                            ),
                            <<<<<<(erlang:element(2, Dep))/binary,
                                        " = \""/utf8>>/binary,
                                    Clean/binary>>/binary,
                                "\""/utf8>>
                    end
            end end),
    case Lines of
        [] ->
            <<""/utf8>>;

        _ ->
            <<(gleam@string:join(Lines, <<"\n"/utf8>>))/binary, "\n"/utf8>>
    end.

-file("src/glipt/internal/toml.gleam", 78).
?DOC(false).
-spec resolve_path_deps(list(binary()), binary()) -> binary().
resolve_path_deps(Project_paths, Script_dir) ->
    Lines = gleam@list:filter_map(
        Project_paths,
        fun(Rel_path) ->
            case glipt@internal@project:resolve_project_path(
                Script_dir,
                Rel_path
            ) of
                {ok, Root} ->
                    case glipt@internal@project:read_project_name(Root) of
                        {ok, Name} ->
                            {ok,
                                <<<<<<Name/binary, " = { path = \""/utf8>>/binary,
                                        Root/binary>>/binary,
                                    "\" }"/utf8>>};

                        {error, nil} ->
                            {error, nil}
                    end;

                {error, nil} ->
                    {error, nil}
            end
        end
    ),
    case Lines of
        [] ->
            <<""/utf8>>;

        _ ->
            <<(gleam@string:join(Lines, <<"\n"/utf8>>))/binary, "\n"/utf8>>
    end.

-file("src/glipt/internal/toml.gleam", 47).
?DOC(false).
-spec deps_section(list(glipt@parser:dependency()), list(binary()), binary()) -> binary().
deps_section(Deps, Project_paths, Script_dir) ->
    Hex_lines = format_dep_lines(Deps),
    Path_lines = resolve_path_deps(Project_paths, Script_dir),
    <<<<"\n[dependencies]\n"/utf8, Hex_lines/binary>>/binary,
        Path_lines/binary>>.

-file("src/glipt/internal/toml.gleam", 96).
?DOC(false).
-spec ensure_stdlib(list(glipt@parser:dependency())) -> list(glipt@parser:dependency()).
ensure_stdlib(Deps) ->
    Has_stdlib = gleam@list:any(
        Deps,
        fun(Dep) -> erlang:element(2, Dep) =:= <<"gleam_stdlib"/utf8>> end
    ),
    case Has_stdlib of
        true ->
            Deps;

        false ->
            [{dependency,
                    <<"gleam_stdlib"/utf8>>,
                    <<">= 0.44.0 and < 2.0.0"/utf8>>} |
                Deps]
    end.

-file("src/glipt/internal/toml.gleam", 7).
?DOC(false).
-spec generate_runtime_toml(
    glipt@parser:script_meta(),
    glipt@target:target(),
    binary()
) -> binary().
generate_runtime_toml(Meta, Target, Script_dir) ->
    Header = <<<<"name = \"glipt_script\"\nversion = \"0.0.0\"\ntarget = \""/utf8,
            (glipt@target:to_string(Target))/binary>>/binary,
        "\"\n"/utf8>>,
    <<<<Header/binary, (gleam_section(Meta))/binary>>/binary,
        (deps_section(
            ensure_stdlib(erlang:element(4, Meta)),
            erlang:element(3, Meta),
            Script_dir
        ))/binary>>.

-file("src/glipt/internal/toml.gleam", 21).
?DOC(false).
-spec generate_project_toml(binary(), glipt@parser:script_meta()) -> binary().
generate_project_toml(Name, Meta) ->
    Header = <<<<"name = \""/utf8, Name/binary>>/binary,
        "\"\nversion = \"0.1.0\"\n"/utf8>>,
    <<<<<<<<Header/binary, (gleam_section(Meta))/binary>>/binary,
                "\n[dependencies]\n"/utf8>>/binary,
            (format_dep_lines(ensure_stdlib(erlang:element(4, Meta))))/binary>>/binary,
        "\n[dev_dependencies]\ngleeunit = \">= 1.0.0 and < 2.0.0\"\n"/utf8>>.

-file("src/glipt/internal/toml.gleam", 123).
?DOC(false).
-spec collect_key_values(list(binary())) -> list(glipt@parser:dependency()).
collect_key_values(Lines) ->
    case Lines of
        [] ->
            [];

        [Line | Rest] ->
            Trimmed = gleam@string:trim(Line),
            case gleam_stdlib:string_starts_with(Trimmed, <<"["/utf8>>) of
                true ->
                    [];

                false ->
                    case gleam@string:split_once(Trimmed, <<"="/utf8>>) of
                        {ok, {Key, Value}} ->
                            Name = gleam@string:trim(Key),
                            Val = gleam@string:trim(Value),
                            case Name of
                                <<""/utf8>> ->
                                    collect_key_values(Rest);

                                _ ->
                                    [{dependency, Name, Val} |
                                        collect_key_values(Rest)]
                            end;

                        {error, nil} ->
                            collect_key_values(Rest)
                    end
            end
    end.

-file("src/glipt/internal/toml.gleam", 107).
?DOC(false).
-spec do_parse_section(list(binary()), binary()) -> list(glipt@parser:dependency()).
do_parse_section(Lines, Section_header) ->
    case Lines of
        [] ->
            [];

        [Line | Rest] ->
            Trimmed = gleam@string:trim(Line),
            case gleam_stdlib:string_starts_with(Trimmed, Section_header) of
                true ->
                    collect_key_values(Rest);

                false ->
                    do_parse_section(Rest, Section_header)
            end
    end.

-file("src/glipt/internal/toml.gleam", 30).
?DOC(false).
-spec parse_deps(binary()) -> list(glipt@parser:dependency()).
parse_deps(Content) ->
    Lines = gleam@string:split(Content, <<"\n"/utf8>>),
    do_parse_section(Lines, <<"[dependencies]"/utf8>>).

-file("src/glipt/internal/toml.gleam", 150).
?DOC(false).
-spec do_parse_gleam_version(list(binary()), boolean()) -> {ok, binary()} |
    {error, nil}.
do_parse_gleam_version(Lines, In_gleam) ->
    case Lines of
        [] ->
            {error, nil};

        [Line | Rest] ->
            Trimmed = gleam@string:trim(Line),
            case gleam_stdlib:string_starts_with(Trimmed, <<"[gleam]"/utf8>>) of
                true ->
                    do_parse_gleam_version(Rest, true);

                false ->
                    case In_gleam of
                        false ->
                            do_parse_gleam_version(Rest, false);

                        true ->
                            case gleam_stdlib:string_starts_with(
                                Trimmed,
                                <<"["/utf8>>
                            ) of
                                true ->
                                    {error, nil};

                                false ->
                                    case gleam_stdlib:string_starts_with(
                                        Trimmed,
                                        <<"version"/utf8>>
                                    ) of
                                        true ->
                                            case gleam@string:split_once(
                                                Trimmed,
                                                <<"="/utf8>>
                                            ) of
                                                {ok, {_, Value}} ->
                                                    {ok,
                                                        begin
                                                            _pipe = Value,
                                                            _pipe@1 = gleam@string:trim(
                                                                _pipe
                                                            ),
                                                            gleam@string:replace(
                                                                _pipe@1,
                                                                <<"\""/utf8>>,
                                                                <<""/utf8>>
                                                            )
                                                        end};

                                                {error, nil} ->
                                                    do_parse_gleam_version(
                                                        Rest,
                                                        true
                                                    )
                                            end;

                                        false ->
                                            do_parse_gleam_version(Rest, true)
                                    end
                            end
                    end
            end
    end.

-file("src/glipt/internal/toml.gleam", 35).
?DOC(false).
-spec parse_gleam_version(binary()) -> {ok, binary()} | {error, nil}.
parse_gleam_version(Content) ->
    Lines = gleam@string:split(Content, <<"\n"/utf8>>),
    do_parse_gleam_version(Lines, false).