Skip to main content

src/molt@internal@cst@builder.erl

-module(molt@internal@cst@builder).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/molt/internal/cst/builder.gleam").
-export([drop_leading_newlines/1, ensure_leading_newline/1, build_key_tokens/1, build_empty_table/1, build_empty_array_of_tables/1, rewrite_header_path/2, build_kv_node/2, build_kv_from_path/2, build_inline_kv/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/molt/internal/cst/builder.gleam", 14).
?DOC(false).
-spec drop_leading_newlines(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()).
drop_leading_newlines(Node) ->
    case erlang:element(4, Node) of
        bare ->
            Node;

        {trivia, Leading, Trailing} ->
            {node,
                erlang:element(2, Node),
                erlang:element(3, Node),
                {trivia,
                    gleam@list:drop_while(
                        Leading,
                        fun(T) -> erlang:element(2, T) =:= newline end
                    ),
                    Trailing}}
    end.

-file("src/molt/internal/cst/builder.gleam", 31).
?DOC(false).
-spec ensure_leading_newline(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()).
ensure_leading_newline(Node) ->
    Newline = {token, newline, <<""/utf8>>},
    case erlang:element(4, Node) of
        bare ->
            {node,
                erlang:element(2, Node),
                erlang:element(3, Node),
                {trivia, [Newline], []}};

        {trivia, [First | _], _} when erlang:element(2, First) =:= newline ->
            Node;

        {trivia, Leading, Trailing} ->
            {node,
                erlang:element(2, Node),
                erlang:element(3, Node),
                {trivia, [Newline | Leading], Trailing}}
    end.

-file("src/molt/internal/cst/builder.gleam", 128).
?DOC(false).
-spec build_key_tokens(list(binary())) -> list(greenwood:element(molt@types:toml_kind())).
build_key_tokens(Path) ->
    case Path of
        [] ->
            [];

        [First | Rest] ->
            First_tok = {token_element,
                molt@internal@utils:make_key_token(First)},
            gleam@list:fold(
                Rest,
                [First_tok],
                fun(Acc, Segment) ->
                    lists:append(
                        Acc,
                        [{token_element, {token, dot, <<""/utf8>>}},
                            {token_element,
                                molt@internal@utils:make_key_token(Segment)}]
                    )
                end
            )
    end.

-file("src/molt/internal/cst/builder.gleam", 143).
?DOC(false).
-spec wrap_brackets(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())).
wrap_brackets(Keys) ->
    Open = {token_element, {token, left_bracket, <<""/utf8>>}},
    Close = {token_element, {token, right_bracket, <<""/utf8>>}},
    [Open | lists:append(Keys, [Close])].

-file("src/molt/internal/cst/builder.gleam", 41).
?DOC(false).
-spec build_empty_table(list(binary())) -> greenwood:node_(molt@types:toml_kind()).
build_empty_table(Path) ->
    greenwood:node_with_trivia(
        table,
        lists:append(
            wrap_brackets(build_key_tokens(Path)),
            [{token_element, {token, newline, <<""/utf8>>}}]
        ),
        {trivia, [{token, newline, <<""/utf8>>}], []}
    ).

-file("src/molt/internal/cst/builder.gleam", 149).
?DOC(false).
-spec wrap_double_brackets(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())).
wrap_double_brackets(Keys) ->
    Ob = {token_element, {token, left_bracket, <<""/utf8>>}},
    Cb = {token_element, {token, right_bracket, <<""/utf8>>}},
    [Ob, Ob | lists:append(Keys, [Cb, Cb])].

-file("src/molt/internal/cst/builder.gleam", 54).
?DOC(false).
-spec build_empty_array_of_tables(list(binary())) -> greenwood:node_(molt@types:toml_kind()).
build_empty_array_of_tables(Path) ->
    greenwood:node_with_trivia(
        array_of_tables,
        lists:append(
            wrap_double_brackets(build_key_tokens(Path)),
            [{token_element, {token, newline, <<""/utf8>>}}]
        ),
        {trivia, [{token, newline, <<""/utf8>>}], []}
    ).

-file("src/molt/internal/cst/builder.gleam", 157).
?DOC(false).
-spec rebuild_header(
    list(greenwood:element(molt@types:toml_kind())),
    list(binary())
) -> list(greenwood:element(molt@types:toml_kind())).
rebuild_header(Children, New_path) ->
    {Brackets, Rest} = gleam@list:split_while(Children, fun(El) -> case El of
                {token_element, {token, left_bracket, _}} ->
                    true;

                _ ->
                    false
            end end),
    {_, Rest@1} = gleam@list:split_while(Rest, fun(El@1) -> case El@1 of
                {token_element, {token, right_bracket, _}} ->
                    false;

                _ ->
                    true
            end end),
    lists:append([Brackets, build_key_tokens(New_path), Rest@1]).

-file("src/molt/internal/cst/builder.gleam", 67).
?DOC(false).
-spec rewrite_header_path(
    greenwood:node_(molt@types:toml_kind()),
    list(binary())
) -> greenwood:node_(molt@types:toml_kind()).
rewrite_header_path(Table, New_path) ->
    {node,
        erlang:element(2, Table),
        rebuild_header(erlang:element(3, Table), New_path),
        erlang:element(4, Table)}.

-file("src/molt/internal/cst/builder.gleam", 74).
?DOC(false).
-spec build_kv_node(binary(), greenwood:element(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()).
build_kv_node(Key, Value) ->
    Children = [{token_element, molt@internal@utils:make_key_token(Key)},
        {token_element, {token, whitespace, <<" "/utf8>>}},
        {token_element, {token, equals, <<""/utf8>>}},
        {token_element, {token, whitespace, <<" "/utf8>>}},
        Value,
        {token_element, {token, newline, <<""/utf8>>}}],
    greenwood:node(key_value, Children).

-file("src/molt/internal/cst/builder.gleam", 90).
?DOC(false).
-spec build_kv_from_path(
    list(binary()),
    greenwood:element(molt@types:toml_kind())
) -> greenwood:node_(molt@types:toml_kind()).
build_kv_from_path(Key, Value) ->
    Key_elements = case Key of
        [Single] ->
            [{token_element, molt@internal@utils:make_key_token(Single)}];

        _ ->
            [{node_element, greenwood:node(key, build_key_tokens(Key))}]
    end,
    Children = lists:append(
        [Key_elements,
            [{token_element, {token, whitespace, <<" "/utf8>>}},
                {token_element, {token, equals, <<""/utf8>>}},
                {token_element, {token, whitespace, <<" "/utf8>>}},
                Value,
                {token_element, {token, newline, <<""/utf8>>}}]]
    ),
    greenwood:node(key_value, Children).

-file("src/molt/internal/cst/builder.gleam", 114).
?DOC(false).
-spec build_inline_kv(binary(), greenwood:element(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()).
build_inline_kv(Key, Value) ->
    Children = [{token_element, molt@internal@utils:make_key_token(Key)},
        {token_element, {token, whitespace, <<" "/utf8>>}},
        {token_element, {token, equals, <<""/utf8>>}},
        {token_element, {token, whitespace, <<" "/utf8>>}},
        Value],
    greenwood:node(key_value, Children).