src/gleeam_code@internal@meta.erl

-module(gleeam_code@internal@meta).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gleeam_code/internal/meta.gleam").
-export([find_value/2, read/1, save_status/4]).
-export_type([submit_meta/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 submit_meta() :: {submit_meta, binary(), list(binary()), binary()}.

-file("src/gleeam_code/internal/meta.gleam", 36).
?DOC(false).
-spec find_value(list(binary()), binary()) -> binary().
find_value(Lines, Key) ->
    case Lines of
        [] ->
            <<""/utf8>>;

        [Line | Rest] ->
            case gleam_stdlib:string_starts_with(Line, <<Key/binary, "="/utf8>>) of
                true ->
                    _pipe = gleam@string:drop_start(
                        Line,
                        string:length(Key) + 1
                    ),
                    gleam@string:trim(_pipe);

                false ->
                    find_value(Rest, Key)
            end
    end.

-file("src/gleeam_code/internal/meta.gleam", 9).
?DOC(false).
-spec read(binary()) -> {ok, submit_meta()} | {error, binary()}.
read(Meta_path) ->
    case gleeam_code@internal@file:read(Meta_path) of
        {error, _} ->
            {error,
                <<"No .glc_meta found. Re-run 'glc fetch' for this problem."/utf8>>};

        {ok, Content} ->
            Lines = gleam@string:split(Content, <<"\n"/utf8>>),
            Func_name = find_value(Lines, <<"entry_function"/utf8>>),
            Params_str = find_value(Lines, <<"params"/utf8>>),
            Return_type = find_value(Lines, <<"return_type"/utf8>>),
            case Func_name of
                <<""/utf8>> ->
                    {error, <<"No entry_function in .glc_meta"/utf8>>};

                Name ->
                    Param_types = case Params_str of
                        <<""/utf8>> ->
                            [];

                        S ->
                            gleam@string:split(S, <<","/utf8>>)
                    end,
                    {ok, {submit_meta, Name, Param_types, Return_type}}
            end
    end.

-file("src/gleeam_code/internal/meta.gleam", 78).
?DOC(false).
-spec remove_key(binary(), binary()) -> binary().
remove_key(Content, Key) ->
    _pipe = Content,
    _pipe@1 = gleam@string:split(_pipe, <<"\n"/utf8>>),
    _pipe@2 = gleam@list:filter(
        _pipe@1,
        fun(Line) ->
            not gleam_stdlib:string_starts_with(Line, <<Key/binary, "="/utf8>>)
        end
    ),
    gleam@string:join(_pipe@2, <<"\n"/utf8>>).

-file("src/gleeam_code/internal/meta.gleam", 49).
?DOC(false).
-spec save_status(binary(), binary(), binary(), binary()) -> nil.
save_status(Meta_path, Status, Runtime, Memory) ->
    case gleeam_code@internal@file:read(Meta_path) of
        {ok, Content} ->
            Updated = begin
                _pipe = Content,
                _pipe@1 = remove_key(_pipe, <<"status"/utf8>>),
                _pipe@2 = remove_key(_pipe@1, <<"runtime"/utf8>>),
                remove_key(_pipe@2, <<"memory"/utf8>>)
            end,
            New_content = <<<<<<<<<<<<<<(gleam@string:trim_end(Updated))/binary,
                                        "\nstatus="/utf8>>/binary,
                                    Status/binary>>/binary,
                                "\nruntime="/utf8>>/binary,
                            Runtime/binary>>/binary,
                        "\nmemory="/utf8>>/binary,
                    Memory/binary>>/binary,
                "\n"/utf8>>,
            _ = gleeam_code@internal@file:write(Meta_path, New_content),
            nil;

        {error, _} ->
            nil
    end.