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