-module(tomlet@path). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/tomlet/path.gleam"). -export([get/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/tomlet/path.gleam", 74). ?DOC(false). -spec scan_inline_entry( tomlet@ast:key(), tomlet@ast:value(), list(tomlet@ast:inline_table_entry()), list(binary()), list(binary()) ) -> {ok, tomlet@ast:value()} | {error, nil}. scan_inline_entry(Key, Value, Rest, Active_path, Target) -> Full_key = lists:append(Active_path, tomlet@key:to_strings(Key)), gleam@bool:guard(Full_key =:= Target, {ok, Value}, fun() -> case Value of {inline_table, Nested_entries, _} -> case scan_inline_entries(Nested_entries, Full_key, Target) of {ok, Found} -> {ok, Found}; {error, nil} -> scan_inline_entries(Rest, Active_path, Target) end; _ -> scan_inline_entries(Rest, Active_path, Target) end end). -file("src/tomlet/path.gleam", 62). ?DOC(false). -spec scan_inline_entries( list(tomlet@ast:inline_table_entry()), list(binary()), list(binary()) ) -> {ok, tomlet@ast:value()} | {error, nil}. scan_inline_entries(Entries, Active_path, Target) -> case Entries of [] -> {error, nil}; [{inline_table_entry, _, Key, Value, _} | Rest] -> scan_inline_entry(Key, Value, Rest, Active_path, Target) end. -file("src/tomlet/path.gleam", 43). ?DOC(false). -spec scan_key_value( tomlet@ast:key(), tomlet@ast:value(), list(tomlet@ast:entry()), list(binary()), list(binary()) ) -> {ok, tomlet@ast:value()} | {error, nil}. scan_key_value(Key, Value, Rest, Active_table, Target) -> Full_key = lists:append(Active_table, tomlet@key:to_strings(Key)), gleam@bool:guard(Full_key =:= Target, {ok, Value}, fun() -> case Value of {inline_table, Inline_entries, _} -> case scan_inline_entries(Inline_entries, Full_key, Target) of {ok, Found} -> {ok, Found}; {error, nil} -> scan_entries(Rest, Active_table, Target) end; _ -> scan_entries(Rest, Active_table, Target) end end). -file("src/tomlet/path.gleam", 20). ?DOC(false). -spec scan_entries(list(tomlet@ast:entry()), list(binary()), list(binary())) -> {ok, tomlet@ast:value()} | {error, nil}. scan_entries(Entries, Active_table, Target) -> case Entries of [] -> {error, nil}; [Entry | Rest] -> case Entry of {table_header, {header, Key, standard_table, _}} -> scan_entries(Rest, tomlet@key:to_strings(Key), Target); {table_header, {header, Key@1, array_of_tables_header, _}} -> scan_entries(Rest, tomlet@key:to_strings(Key@1), Target); {key_value, _, Key@2, Value, _} -> scan_key_value(Key@2, Value, Rest, Active_table, Target); _ -> scan_entries(Rest, Active_table, Target) end end. -file("src/tomlet/path.gleam", 158). ?DOC(false). -spec finish_array_table( gleam@option:option(tomlet@ast:header()), list(tomlet@ast:entry()), list(tomlet@ast:table()) ) -> list(tomlet@ast:table()). finish_array_table(Current_header, Current_entries, Tables) -> case Current_header of {some, Header} -> [{table, lists:reverse(Current_entries), {some, Header}} | Tables]; none -> Tables end. -file("src/tomlet/path.gleam", 140). ?DOC(false). -spec collect_array_table_header( tomlet@ast:header(), list(tomlet@ast:entry()), list(binary()), list(tomlet@ast:table()) ) -> list(tomlet@ast:table()). collect_array_table_header(Header, Rest, Target, Next_tables) -> case Header of {header, Key, array_of_tables_header, _} -> Next_header = case tomlet@key:to_strings(Key) =:= Target of true -> {some, Header}; false -> none end, collect_array_tables_loop( Rest, Target, Next_header, [], Next_tables ); _ -> collect_array_tables_loop(Rest, Target, none, [], Next_tables) end. -file("src/tomlet/path.gleam", 100). ?DOC(false). -spec collect_array_tables_loop( list(tomlet@ast:entry()), list(binary()), gleam@option:option(tomlet@ast:header()), list(tomlet@ast:entry()), list(tomlet@ast:table()) ) -> list(tomlet@ast:table()). collect_array_tables_loop( Entries, Target, Current_header, Current_entries, Tables ) -> case Entries of [] -> lists:reverse( finish_array_table(Current_header, Current_entries, Tables) ); [Entry | Rest] -> case Entry of {table_header, Header} -> Next_tables = finish_array_table( Current_header, Current_entries, Tables ), collect_array_table_header( Header, Rest, Target, Next_tables ); _ -> case Current_header of {some, _} -> collect_array_tables_loop( Rest, Target, Current_header, [Entry | Current_entries], Tables ); none -> collect_array_tables_loop( Rest, Target, Current_header, Current_entries, Tables ) end end end. -file("src/tomlet/path.gleam", 93). ?DOC(false). -spec collect_array_tables(list(tomlet@ast:entry()), list(binary())) -> list(tomlet@ast:table()). collect_array_tables(Entries, Target) -> collect_array_tables_loop(Entries, Target, none, [], []). -file("src/tomlet/path.gleam", 12). ?DOC(false). -spec get(tomlet@ast:table(), list(binary())) -> {ok, tomlet@ast:value()} | {error, nil}. get(Table, Path) -> {table, Entries, _} = Table, case collect_array_tables(Entries, Path) of [] -> scan_entries(Entries, [], Path); Tables -> {ok, {array_of_tables, Tables}} end.