-module(molt@internal@cst@elements). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/molt/internal/cst/elements.gleam"). -export([document_newline/1, extract_key_segments/1, key_path/1, child_key_paths/1, skip_trivia/1, skip_all_trivia/1, key_name/1, value_tokens/1, find_first_value/1, get_kv_children/1, is_toml/1, split_at_equals/1, split_leading_ws/1, split_before_trivia/1, take_trailing_ws/1, extract_inline_entries/1, extract_array_items/1, array_layout/1, build_array_item/2, rebuild_array/2, kv_to_section_form/1, section_kvs_to_inline_table/1, inline_tables_to_array/1, inline_tables_to_multiline_array/2, inline_trailing_trivia/1, rewrite_kv_key_in_place/2]). -export_type([array_layout/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 array_layout() :: single_line | {multi_line, binary()}. -file("src/molt/internal/cst/elements.gleam", 42). ?DOC(false). -spec first_literal_newline_in_tokens( list(greenwood:token(molt@types:toml_kind())) ) -> gleam@option:option(binary()). first_literal_newline_in_tokens(Tokens) -> case Tokens of [] -> none; [{token, newline, Text} | _] when Text =/= <<""/utf8>> -> {some, Text}; [_ | Rest] -> first_literal_newline_in_tokens(Rest) end. -file("src/molt/internal/cst/elements.gleam", 52). ?DOC(false). -spec first_literal_newline_in_children( list(greenwood:element(molt@types:toml_kind())) ) -> gleam@option:option(binary()). first_literal_newline_in_children(Els) -> case Els of [] -> none; [{token_element, {token, newline, Text}} | _] when Text =/= <<""/utf8>> -> {some, Text}; [{token_element, _} | Rest] -> first_literal_newline_in_children(Rest); [{node_element, N} | Rest@1] -> _pipe = first_literal_newline(N), gleam@option:lazy_or( _pipe, fun() -> first_literal_newline_in_children(Rest@1) end ) end. -file("src/molt/internal/cst/elements.gleam", 30). ?DOC(false). -spec first_literal_newline(greenwood:node_(molt@types:toml_kind())) -> gleam@option:option(binary()). first_literal_newline(Node) -> case erlang:element(4, Node) of {trivia, Leading, Trailing} -> _pipe = first_literal_newline_in_tokens(Leading), _pipe@1 = gleam@option:lazy_or( _pipe, fun() -> first_literal_newline_in_children(erlang:element(3, Node)) end ), gleam@option:lazy_or( _pipe@1, fun() -> first_literal_newline_in_tokens(Trailing) end ); bare -> first_literal_newline_in_children(erlang:element(3, Node)) end. -file("src/molt/internal/cst/elements.gleam", 23). ?DOC(false). -spec document_newline(greenwood:node_(molt@types:toml_kind())) -> binary(). document_newline(Node) -> case first_literal_newline(Node) of {some, <<"\r\n"/utf8>>} -> <<"\r\n"/utf8>>; _ -> <<"\n"/utf8>> end. -file("src/molt/internal/cst/elements.gleam", 116). ?DOC(false). -spec extract_key_segments(list(greenwood:element(molt@types:toml_kind()))) -> list(binary()). extract_key_segments(Children) -> gleam@list:filter_map(Children, fun(El) -> case El of {token_element, {token, bare_key, Text}} -> {ok, Text}; {token_element, {token, integer, Text@1}} -> {ok, Text@1}; {token_element, {token, basic_string, Text@2}} -> {ok, molt@internal@utils:unescape_basic_string(Text@2)}; {token_element, {token, literal_string, Text@3}} -> {ok, Text@3}; _ -> {error, nil} end end). -file("src/molt/internal/cst/elements.gleam", 65). ?DOC(false). -spec key_path(list(greenwood:element(molt@types:toml_kind()))) -> gleam@option:option(list(binary())). key_path(Children) -> case Children of [] -> none; [{token_element, {token, equals, _}} | _] -> none; [{node_element, N} | _] when erlang:element(2, N) =:= key -> {some, extract_key_segments(erlang:element(3, N))}; [{token_element, {token, bare_key, Text}} | _] -> {some, [Text]}; [{token_element, {token, integer, Text@1}} | _] -> {some, [Text@1]}; [{token_element, {token, basic_string, Text@2}} | _] -> {some, [molt@internal@utils:unescape_basic_string(Text@2)]}; [{token_element, {token, literal_string, Text@3}} | _] -> {some, [Text@3]}; [_ | Rest] -> key_path(Rest) end. -file("src/molt/internal/cst/elements.gleam", 81). ?DOC(false). -spec child_key_paths(greenwood:node_(molt@types:toml_kind())) -> list(list(binary())). child_key_paths(Node) -> gleam@list:filter_map(erlang:element(3, Node), fun(El) -> case El of {node_element, Kv} when erlang:element(2, Kv) =:= key_value -> gleam@option:to_result(key_path(erlang:element(3, Kv)), nil); _ -> {error, nil} end end). -file("src/molt/internal/cst/elements.gleam", 92). ?DOC(false). -spec skip_trivia(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). skip_trivia(Children) -> case Children of [{token_element, {token, whitespace, _}} | Rest] -> skip_trivia(Rest); [{token_element, {token, newline, _}} | Rest] -> skip_trivia(Rest); _ -> Children end. -file("src/molt/internal/cst/elements.gleam", 103). ?DOC(false). -spec skip_all_trivia(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). skip_all_trivia(Children) -> case Children of [{token_element, {token, whitespace, _}} | Rest] -> skip_all_trivia(Rest); [{token_element, {token, newline, _}} | Rest] -> skip_all_trivia(Rest); [{token_element, {token, comment, _}} | Rest] -> skip_all_trivia(Rest); _ -> Children end. -file("src/molt/internal/cst/elements.gleam", 130). ?DOC(false). -spec key_name(list(greenwood:element(molt@types:toml_kind()))) -> gleam@option:option(binary()). key_name(Children) -> case Children of [] -> none; [{token_element, {token, equals, _}} | _] -> none; [{token_element, {token, bare_key, Text}} | _] -> {some, Text}; [{token_element, {token, integer, Text@1}} | _] -> {some, Text@1}; [{token_element, {token, basic_string, Text@2}} | _] -> {some, molt@internal@utils:unescape_basic_string(Text@2)}; [{token_element, {token, literal_string, Text@3}} | _] -> {some, Text@3}; [_ | Rest] -> key_name(Rest) end. -file("src/molt/internal/cst/elements.gleam", 144). ?DOC(false). -spec value_tokens(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). value_tokens(Children) -> case Children of [] -> []; [{token_element, {token, equals, _}} | Rest] -> Rest; [_ | Rest@1] -> value_tokens(Rest@1) end. -file("src/molt/internal/cst/elements.gleam", 155). ?DOC(false). -spec find_first_value(list(greenwood:element(molt@types:toml_kind()))) -> gleam@option:option(greenwood:element(molt@types:toml_kind())). find_first_value(Elements) -> case Elements of [] -> none; [{token_element, {token, whitespace, _}} | Rest] -> find_first_value(Rest); [{token_element, {token, newline, _}} | Rest] -> find_first_value(Rest); [{token_element, {token, comment, _}} | Rest] -> find_first_value(Rest); [El | _] -> {some, El} end. -file("src/molt/internal/cst/elements.gleam", 835). ?DOC(false). -spec child_nodes_of_kind( list(greenwood:element(molt@types:toml_kind())), molt@types:toml_kind() ) -> list(greenwood:node_(molt@types:toml_kind())). child_nodes_of_kind(Children, Kind) -> gleam@list:filter_map(Children, fun(El) -> case El of {node_element, N} when erlang:element(2, N) =:= Kind -> {ok, N}; _ -> {error, nil} end end). -file("src/molt/internal/cst/elements.gleam", 168). ?DOC(false). -spec get_kv_children(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:node_(molt@types:toml_kind())). get_kv_children(Children) -> child_nodes_of_kind(Children, key_value). -file("src/molt/internal/cst/elements.gleam", 858). ?DOC(false). -spec is_only_trivia(list(greenwood:element(molt@types:toml_kind()))) -> boolean(). is_only_trivia(Children) -> gleam@list:all(Children, fun(El) -> case El of {token_element, {token, bom, _}} -> true; {token_element, {token, comment, _}} -> true; {token_element, {token, whitespace, _}} -> true; {token_element, {token, newline, _}} -> true; {node_element, N} when erlang:element(2, N) =:= post_script -> true; _ -> false end end). -file("src/molt/internal/cst/elements.gleam", 847). ?DOC(false). -spec node_has_equals(greenwood:node_(molt@types:toml_kind())) -> boolean(). node_has_equals(Node) -> gleam@list:any(erlang:element(3, Node), fun(El) -> case El of {token_element, {token, equals, _}} -> true; _ -> false end end). -file("src/molt/internal/cst/elements.gleam", 876). ?DOC(false). -spec has_toml_nodes(list(greenwood:element(molt@types:toml_kind()))) -> boolean(). has_toml_nodes(Children) -> gleam@list:any(Children, fun(El) -> case El of {node_element, N} when erlang:element(2, N) =:= table -> true; {node_element, N@1} when erlang:element(2, N@1) =:= array_of_tables -> true; {node_element, N@2} when erlang:element(2, N@2) =:= key_value -> node_has_equals(N@2); _ -> false end end). -file("src/molt/internal/cst/elements.gleam", 178). ?DOC(false). -spec is_toml(list(greenwood:element(molt@types:toml_kind()))) -> boolean(). is_toml(Children) -> has_toml_nodes(Children) orelse is_only_trivia(Children). -file("src/molt/internal/cst/elements.gleam", 184). ?DOC(false). -spec split_at_equals(list(greenwood:element(molt@types:toml_kind()))) -> {list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind()))}. split_at_equals(Children) -> gleam@list:split_while(Children, fun(El) -> case El of {token_element, {token, equals, _}} -> false; _ -> true end end). -file("src/molt/internal/cst/elements.gleam", 196). ?DOC(false). -spec split_leading_ws(list(greenwood:element(molt@types:toml_kind()))) -> {list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind()))}. split_leading_ws(Children) -> gleam@list:split_while(Children, fun(El) -> case El of {token_element, {token, whitespace, _}} -> true; _ -> false end end). -file("src/molt/internal/cst/elements.gleam", 209). ?DOC(false). -spec split_before_trivia(list(greenwood:element(molt@types:toml_kind()))) -> {list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind()))}. split_before_trivia(Children) -> gleam@list:split_while(Children, fun(El) -> case El of {token_element, {token, comment, _}} -> false; {token_element, {token, newline, _}} -> false; _ -> true end end). -file("src/molt/internal/cst/elements.gleam", 223). ?DOC(false). -spec take_trailing_ws(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). take_trailing_ws(Els) -> _pipe = Els, _pipe@1 = lists:reverse(_pipe), _pipe@2 = gleam@list:take_while(_pipe@1, fun(El) -> case El of {token_element, {token, whitespace, _}} -> true; _ -> false end end), lists:reverse(_pipe@2). -file("src/molt/internal/cst/elements.gleam", 250). ?DOC(false). -spec extract_inline_entries(greenwood:node_(molt@types:toml_kind())) -> list(greenwood:node_(molt@types:toml_kind())). extract_inline_entries(Inline_table) -> get_kv_children(erlang:element(3, Inline_table)). -file("src/molt/internal/cst/elements.gleam", 258). ?DOC(false). -spec extract_array_items(greenwood:node_(molt@types:toml_kind())) -> list(greenwood:node_(molt@types:toml_kind())). extract_array_items(Array) -> child_nodes_of_kind(erlang:element(3, Array), array_element). -file("src/molt/internal/cst/elements.gleam", 306). ?DOC(false). -spec leading_indent(greenwood:node_(molt@types:toml_kind())) -> {ok, binary()} | {error, nil}. leading_indent(Element) -> case erlang:element(4, Element) of {trivia, Leading, _} -> gleam@list:find_map(Leading, fun(T) -> case erlang:element(2, T) of whitespace -> {ok, erlang:element(3, T)}; _ -> {error, nil} end end); bare -> {error, nil} end. -file("src/molt/internal/cst/elements.gleam", 299). ?DOC(false). -spec detect_array_indent(list(greenwood:node_(molt@types:toml_kind()))) -> binary(). detect_array_indent(Items) -> case gleam@list:filter_map(Items, fun leading_indent/1) of [Indent | _] -> Indent; [] -> <<" "/utf8>> end. -file("src/molt/internal/cst/elements.gleam", 283). ?DOC(false). -spec element_is_multiline(greenwood:node_(molt@types:toml_kind())) -> boolean(). element_is_multiline(Element) -> In_children = gleam@list:any( erlang:element(3, Element), fun(El) -> case El of {token_element, {token, newline, _}} -> true; _ -> false end end ), In_children orelse case erlang:element(4, Element) of {trivia, Leading, Trailing} -> gleam@list:any( lists:append(Leading, Trailing), fun(T) -> erlang:element(2, T) =:= newline end ); bare -> false end. -file("src/molt/internal/cst/elements.gleam", 275). ?DOC(false). -spec array_layout(greenwood:node_(molt@types:toml_kind())) -> array_layout(). array_layout(Array) -> Items = extract_array_items(Array), case gleam@list:any(Items, fun element_is_multiline/1) of false -> single_line; true -> {multi_line, detect_array_indent(Items)} end. -file("src/molt/internal/cst/elements.gleam", 323). ?DOC(false). -spec build_array_item( greenwood:element(molt@types:toml_kind()), array_layout() ) -> greenwood:node_(molt@types:toml_kind()). build_array_item(Value, Layout) -> case Layout of single_line -> {node, array_element, [Value], bare}; {multi_line, Indent} -> {node, array_element, [Value, {token_element, {token, comma, <<""/utf8>>}}, {token_element, {token, newline, <<""/utf8>>}}], {trivia, [{token, whitespace, Indent}], []}} end. -file("src/molt/internal/cst/elements.gleam", 797). ?DOC(false). -spec extract_trailing_after_last( list(greenwood:element(molt@types:toml_kind())), molt@types:toml_kind() ) -> list(greenwood:element(molt@types:toml_kind())). extract_trailing_after_last(Body, Kind) -> Match = gleam@list:any(Body, fun(El) -> case El of {node_element, N} when erlang:element(2, N) =:= Kind -> true; _ -> false end end), gleam@bool:guard(not Match, Body, fun() -> _pipe = Body, _pipe@1 = lists:reverse(_pipe), _pipe@2 = gleam@list:take_while(_pipe@1, fun(El@1) -> case El@1 of {node_element, N@1} when erlang:element(2, N@1) =:= Kind -> false; _ -> true end end), lists:reverse(_pipe@2) end). -file("src/molt/internal/cst/elements.gleam", 783). ?DOC(false). -spec take_up_to_token( list(greenwood:element(molt@types:toml_kind())), molt@types:toml_kind() ) -> {list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind()))}. take_up_to_token(Children, Kind) -> case Children of [] -> {[], []}; [{token_element, {token, K, _}} = Tok | Rest] when K =:= Kind -> {[Tok], Rest}; [El | Rest@1] -> {Prefix, After} = take_up_to_token(Rest@1, Kind), {[El | Prefix], After} end. -file("src/molt/internal/cst/elements.gleam", 771). ?DOC(false). -spec has_comma_token(list(greenwood:element(molt@types:toml_kind()))) -> boolean(). has_comma_token(Children) -> gleam@list:any(Children, fun(El) -> case El of {token_element, {token, comma, _}} -> true; _ -> false end end). -file("src/molt/internal/cst/elements.gleam", 747). ?DOC(false). -spec ensure_trailing_comma( greenwood:node_(molt@types:toml_kind()), array_layout() ) -> greenwood:node_(molt@types:toml_kind()). ensure_trailing_comma(Elem, Layout) -> gleam@bool:guard( has_comma_token(erlang:element(3, Elem)), Elem, fun() -> Separator = case Layout of single_line -> [{token_element, {token, comma, <<""/utf8>>}}, {token_element, {token, whitespace, <<" "/utf8>>}}]; {multi_line, _} -> [{token_element, {token, comma, <<""/utf8>>}}, {token_element, {token, newline, <<""/utf8>>}}] end, case erlang:element(3, Elem) of [Value | Trailing] -> {node, erlang:element(2, Elem), lists:append([[Value], Separator, Trailing]), erlang:element(4, Elem)}; [] -> Elem end end ). -file("src/molt/internal/cst/elements.gleam", 729). ?DOC(false). -spec ensure_separating_commas( list(greenwood:node_(molt@types:toml_kind())), array_layout() ) -> list(greenwood:node_(molt@types:toml_kind())). ensure_separating_commas(Items, Layout) -> case Items of [] -> []; [Single] -> [Single]; [Head | Rest] -> [ensure_trailing_comma(Head, Layout) | ensure_separating_commas(Rest, Layout)] end. -file("src/molt/internal/cst/elements.gleam", 350). ?DOC(false). -spec rebuild_array( greenwood:node_(molt@types:toml_kind()), list(greenwood:node_(molt@types:toml_kind())) ) -> greenwood:node_(molt@types:toml_kind()). rebuild_array(Source, Items) -> Normalized = ensure_separating_commas(Items, array_layout(Source)), {Prefix, Body} = take_up_to_token(erlang:element(3, Source), left_bracket), Trailing = extract_trailing_after_last(Body, array_element), Item_elements = gleam@list:map( Normalized, fun(Item) -> {node_element, Item} end ), {node, erlang:element(2, Source), lists:append([Prefix, Item_elements, Trailing]), erlang:element(4, Source)}. -file("src/molt/internal/cst/elements.gleam", 390). ?DOC(false). -spec drop_ws_tokens(list(greenwood:token(molt@types:toml_kind()))) -> list(greenwood:token(molt@types:toml_kind())). drop_ws_tokens(Tokens) -> case Tokens of [{token, whitespace, _} | Rest] -> drop_ws_tokens(Rest); _ -> Tokens end. -file("src/molt/internal/cst/elements.gleam", 382). ?DOC(false). -spec strip_leading_trivia_whitespace(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()). strip_leading_trivia_whitespace(Node) -> case erlang:element(4, Node) of bare -> Node; {trivia, Leading, Trailing} -> {node, erlang:element(2, Node), erlang:element(3, Node), {trivia, drop_ws_tokens(Leading), Trailing}} end. -file("src/molt/internal/cst/elements.gleam", 421). ?DOC(false). -spec ensure_trailing_newline(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). ensure_trailing_newline(Children) -> case lists:reverse(Children) of [{token_element, {token, newline, _}} | _] -> Children; _ -> lists:append( Children, [{token_element, {token, newline, <<""/utf8>>}}] ) end. -file("src/molt/internal/cst/elements.gleam", 411). ?DOC(false). -spec drop_leading_whitespace(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). drop_leading_whitespace(Children) -> case Children of [{token_element, {token, whitespace, _}} | Rest] -> drop_leading_whitespace(Rest); _ -> Children end. -file("src/molt/internal/cst/elements.gleam", 401). ?DOC(false). -spec trim_edge_whitespace(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). trim_edge_whitespace(Children) -> _pipe = Children, _pipe@1 = drop_leading_whitespace(_pipe), _pipe@2 = lists:reverse(_pipe@1), _pipe@3 = drop_leading_whitespace(_pipe@2), lists:reverse(_pipe@3). -file("src/molt/internal/cst/elements.gleam", 364). ?DOC(false). -spec kv_to_section_form(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()). kv_to_section_form(Kv) -> Children = begin _pipe = erlang:element(3, Kv), _pipe@1 = gleam@list:filter(_pipe, fun(El) -> case El of {token_element, {token, comma, _}} -> false; _ -> true end end), _pipe@2 = trim_edge_whitespace(_pipe@1), ensure_trailing_newline(_pipe@2) end, strip_leading_trivia_whitespace( {node, erlang:element(2, Kv), Children, erlang:element(4, Kv)} ). -file("src/molt/internal/cst/elements.gleam", 685). ?DOC(false). -spec is_trailing_trivia_tok(greenwood:element(molt@types:toml_kind())) -> boolean(). is_trailing_trivia_tok(El) -> case El of {token_element, {token, newline, _}} -> true; {token_element, {token, whitespace, _}} -> true; {token_element, {token, comment, _}} -> true; _ -> false end. -file("src/molt/internal/cst/elements.gleam", 673). ?DOC(false). -spec insert_comma_before_trailing( list(greenwood:element(molt@types:toml_kind())) ) -> list(greenwood:element(molt@types:toml_kind())). insert_comma_before_trailing(Children) -> {Tail_rev, Head_rev} = gleam@list:split_while( lists:reverse(Children), fun is_trailing_trivia_tok/1 ), lists:append( [lists:reverse(Head_rev), [{token_element, {token, comma, <<""/utf8>>}}], lists:reverse(Tail_rev)] ). -file("src/molt/internal/cst/elements.gleam", 587). ?DOC(false). -spec multiline_inline_body(list(greenwood:node_(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). multiline_inline_body(Kvs) -> gleam@list:index_map( Kvs, fun(Kv, I) -> Children = begin _pipe = erlang:element(3, Kv), _pipe@1 = ensure_trailing_newline(_pipe), insert_comma_before_trailing(_pipe@1) end, Leading = case I of 0 -> [{token, newline, <<""/utf8>>}]; _ -> [] end, {node_element, {node, erlang:element(2, Kv), Children, {trivia, Leading, greenwood:trailing_trivia(Kv)}}} end ). -file("src/molt/internal/cst/elements.gleam", 612). ?DOC(false). -spec strip_kv_to_inline(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()). strip_kv_to_inline(Kv) -> Children = gleam@list:filter(erlang:element(3, Kv), fun(El) -> case El of {token_element, {token, newline, _}} -> false; _ -> true end end), {node, erlang:element(2, Kv), Children, bare}. -file("src/molt/internal/cst/elements.gleam", 573). ?DOC(false). -spec with_trailing_separator( greenwood:node_(molt@types:toml_kind()), boolean() ) -> greenwood:node_(molt@types:toml_kind()). with_trailing_separator(Node, Needs_comma) -> gleam@bool:guard( not Needs_comma, Node, fun() -> {node, erlang:element(2, Node), lists:append( erlang:element(3, Node), [{token_element, {token, comma, <<""/utf8>>}}, {token_element, {token, whitespace, <<" "/utf8>>}}] ), erlang:element(4, Node)} end ). -file("src/molt/internal/cst/elements.gleam", 559). ?DOC(false). -spec single_line_inline_body(list(greenwood:node_(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). single_line_inline_body(Kvs) -> Space = {token_element, {token, whitespace, <<" "/utf8>>}}, Last = erlang:length(Kvs) - 1, Entries = gleam@list:index_map( Kvs, fun(Kv, I) -> {node_element, with_trailing_separator(strip_kv_to_inline(Kv), I < Last)} end ), lists:append([[Space], Entries, [Space]]). -file("src/molt/internal/cst/elements.gleam", 694). ?DOC(false). -spec kv_has_comment(greenwood:node_(molt@types:toml_kind())) -> boolean(). kv_has_comment(Kv) -> gleam@list:any(erlang:element(3, Kv), fun(El) -> case El of {token_element, {token, comment, _}} -> true; _ -> false end end) orelse case erlang:element(4, Kv) of {trivia, L, T} -> gleam@list:any( lists:append(L, T), fun(Tok) -> erlang:element(2, Tok) =:= comment end ); bare -> false end. -file("src/molt/internal/cst/elements.gleam", 435). ?DOC(false). -spec section_kvs_to_inline_table(list(greenwood:node_(molt@types:toml_kind()))) -> greenwood:node_(molt@types:toml_kind()). section_kvs_to_inline_table(Kvs) -> Body = case Kvs of [] -> []; _ -> case gleam@list:any(Kvs, fun kv_has_comment/1) of false -> single_line_inline_body(Kvs); true -> multiline_inline_body(Kvs) end end, {node, inline_table, lists:append( [[{token_element, {token, left_brace, <<""/utf8>>}}], Body, [{token_element, {token, right_brace, <<""/utf8>>}}]] ), bare}. -file("src/molt/internal/cst/elements.gleam", 461). ?DOC(false). -spec inline_tables_to_array(list(greenwood:node_(molt@types:toml_kind()))) -> greenwood:node_(molt@types:toml_kind()). inline_tables_to_array(Tables) -> Last = erlang:length(Tables) - 1, Items = gleam@list:index_map( Tables, fun(T, I) -> {node_element, with_trailing_separator( build_array_item({node_element, T}, single_line), I < Last )} end ), {node, array, lists:append( [[{token_element, {token, left_bracket, <<""/utf8>>}}], Items, [{token_element, {token, right_bracket, <<""/utf8>>}}]] ), bare}. -file("src/molt/internal/cst/elements.gleam", 526). ?DOC(false). -spec multiline_array_element( greenwood:node_(molt@types:toml_kind()), list(binary()), gleam@option:option(binary()), boolean() ) -> greenwood:node_(molt@types:toml_kind()). multiline_array_element(Table, Leading, Trailing, Needs_comma) -> Newline = {token, newline, <<""/utf8>>}, Indent = {token, whitespace, <<" "/utf8>>}, Leading_trivia = lists:append( [[Newline, Indent], gleam@list:flat_map( Leading, fun(C) -> [{token, comment, C}, Newline, Indent] end )] ), Comma = case Needs_comma of true -> [{token_element, {token, comma, <<","/utf8>>}}]; false -> [] end, Trailing_tokens = case Trailing of {some, C@1} -> [{token_element, {token, whitespace, <<" "/utf8>>}}, {token_element, {token, comment, C@1}}]; none -> [] end, {node, array_element, lists:append([[{node_element, Table}], Comma, Trailing_tokens]), {trivia, Leading_trivia, []}}. -file("src/molt/internal/cst/elements.gleam", 494). ?DOC(false). -spec inline_tables_to_multiline_array( list(greenwood:node_(molt@types:toml_kind())), list({list(binary()), gleam@option:option(binary())}) ) -> greenwood:node_(molt@types:toml_kind()). inline_tables_to_multiline_array(Tables, Comments) -> Last = erlang:length(Tables) - 1, Items = gleam@list:index_map( gleam@list:zip(Tables, Comments), fun(Pair, I) -> {Table, {Leading, Trailing}} = Pair, {node_element, multiline_array_element(Table, Leading, Trailing, I < Last)} end ), {node, array, lists:append( [[{token_element, {token, left_bracket, <<"["/utf8>>}}], Items, [{token_element, {token, newline, <<""/utf8>>}}, {token_element, {token, right_bracket, <<"]"/utf8>>}}]] ), bare}. -file("src/molt/internal/cst/elements.gleam", 655). ?DOC(false). -spec insert_before_first_newline( list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind())), list(greenwood:element(molt@types:toml_kind())) ) -> list(greenwood:element(molt@types:toml_kind())). insert_before_first_newline(Els, Extra, Acc) -> case Els of [] -> lists:append(lists:reverse(Acc), Extra); [First | Rest] -> case First of {token_element, {token, newline, _}} -> lists:append( lists:reverse(Acc), lists:append(Extra, [First | Rest]) ); _ -> insert_before_first_newline(Rest, Extra, [First | Acc]) end end. -file("src/molt/internal/cst/elements.gleam", 632). ?DOC(false). -spec inline_trailing_trivia(greenwood:node_(molt@types:toml_kind())) -> greenwood:node_(molt@types:toml_kind()). inline_trailing_trivia(Node) -> Children = gleam@list:map(erlang:element(3, Node), fun(El) -> case El of {node_element, N} -> {node_element, inline_trailing_trivia(N)}; {token_element, _} -> El end end), case erlang:element(4, Node) of {trivia, Leading, Trailing} when Trailing =/= [] -> {node, erlang:element(2, Node), insert_before_first_newline( Children, gleam@list:map( Trailing, fun(Field@0) -> {token_element, Field@0} end ), [] ), {trivia, Leading, []}}; _ -> {node, erlang:element(2, Node), Children, erlang:element(4, Node)} end. -file("src/molt/internal/cst/elements.gleam", 823). ?DOC(false). -spec value_tokens_with_equals(list(greenwood:element(molt@types:toml_kind()))) -> list(greenwood:element(molt@types:toml_kind())). value_tokens_with_equals(Children) -> case Children of [] -> []; [{token_element, {token, equals, _}} | _] -> Children; [_ | Rest] -> value_tokens_with_equals(Rest) end. -file("src/molt/internal/cst/elements.gleam", 711). ?DOC(false). -spec rewrite_kv_key_in_place( greenwood:node_(molt@types:toml_kind()), list(binary()) ) -> greenwood:node_(molt@types:toml_kind()). rewrite_kv_key_in_place(Kv, New_key) -> After_key = value_tokens_with_equals(erlang:element(3, Kv)), Key_elements = case New_key of [Single] -> [{token_element, molt@internal@utils:make_key_token(Single)}]; _ -> [{node_element, greenwood:node( key, molt@internal@cst@builder:build_key_tokens(New_key) )}] end, Children = lists:append( [Key_elements, [{token_element, {token, whitespace, <<" "/utf8>>}}], After_key] ), {node, erlang:element(2, Kv), Children, erlang:element(4, Kv)}.