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