-module(spectator@internal@api). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spectator/internal/api.gleam"). -export([invert_sort_direction/1, sort_table_list/3, sort_port_list/3, get_process_list/1, get_process_info/2, get_details/2, is_otp_compatible/2, get_status/3, get_state/3, request_otp_data/3, list_ets_tables/1, get_ets_table_info/2, get_raw_ets_data/2, opaque_tuple_to_list/1, get_ets_data/2, get_port_list/1, get_port_info/2, get_port_details/2, get_memory_statistics/1, sort_process_list/3, format_pid/1, format_port/1, kill_process/2, suspend/2, resume/2, new_ets_table/2, serialize_pid/1, serialize_port/1, decode_pid/1, decode_port/1, compare_dynamic_data/2, sort_table_data/3, get_word_size/1, get_system_info/1, start_tag_manager/0, add_tag/2, get_tag/1, hidden_connect_node/1, connect_node/1, node_from_params/1]). -export_type([erlang_error/0, opaque_tuple/0, sys_state/0, system_primitive/0, table/0, table_data/0, process_otp_status/0, otp_details/0, process_item/0, process_info/0, process_details/0, port_item/0, port_info/0, port_details/0, process_sort_criteria/0, table_sort_criteria/0, port_sort_criteria/0, sort_direction/0, memory_statistics/0, system_info/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 erlang_error() :: {erpc_error, gleam@erlang@atom:atom_()} | not_supported_error | bad_argument_error | returned_undefined_error | not_found_error | no_info_error | {dynamic_error, gleam@dynamic:dynamic_()}. -type opaque_tuple() :: any(). -type sys_state() :: process_running | process_suspended. -type system_primitive() :: {process_primitive, gleam@erlang@process:pid_(), gleam@option:option(gleam@erlang@atom:atom_()), gleam@option:option(binary())} | {port_primitive, gleam@erlang@port:port_(), gleam@option:option(gleam@erlang@atom:atom_())} | {remote_process_primitive, gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_()} | {nif_resource_primitive, gleam@dynamic:dynamic_()}. -type table() :: {table, gleam@erlang@reference:reference_(), gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer(), integer(), system_primitive(), gleam@erlang@atom:atom_(), boolean(), boolean()}. -type table_data() :: {table_data, list(list(gleam@dynamic:dynamic_())), integer()}. -type process_otp_status() :: {process_otp_status, gleam@erlang@process:pid_(), gleam@erlang@atom:atom_(), gleam@erlang@process:pid_(), sys_state(), list(gleam@dynamic:dynamic_())}. -type otp_details() :: {otp_details, gleam@erlang@process:pid_(), process_otp_status(), gleam@dynamic:dynamic_()}. -type process_item() :: {process_item, gleam@erlang@process:pid_(), process_info()}. -type process_info() :: {process_info, {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()}, {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()}, gleam@option:option(gleam@erlang@atom:atom_()), integer(), integer(), integer(), gleam@option:option(binary()), gleam@erlang@atom:atom_()}. -type process_details() :: {process_details, list(gleam@dynamic:dynamic_()), list(system_primitive()), list(system_primitive()), list(system_primitive()), boolean(), gleam@option:option(system_primitive())}. -type port_item() :: {port_item, gleam@erlang@port:port_(), port_info()}. -type port_info() :: {port_info, binary(), gleam@option:option(gleam@erlang@atom:atom_()), system_primitive(), gleam@option:option(integer()), integer(), integer(), integer(), integer()}. -type port_details() :: {port_details, list(system_primitive()), list(system_primitive()), list(system_primitive())}. -type process_sort_criteria() :: sort_by_process_name | sort_by_tag | sort_by_current_function | sort_by_process_memory | sort_by_reductions | sort_by_message_queue | sort_by_process_status. -type table_sort_criteria() :: sort_by_table_id | sort_by_table_name | sort_by_table_type | sort_by_table_size | sort_by_table_memory | sort_by_table_owner | sort_by_table_protection | sort_by_table_read_concurrency | sort_by_table_write_concurrency. -type port_sort_criteria() :: sort_by_port_name | sort_by_port_command | sort_by_port_connected_process | sort_by_port_os_pid | sort_by_port_input | sort_by_port_output | sort_by_port_memory | sort_by_port_queue_size. -type sort_direction() :: ascending | descending. -type memory_statistics() :: {memory_statistics, integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer()}. -type system_info() :: {system_info, binary(), binary(), binary(), binary(), integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer()}. -file("src/spectator/internal/api.gleam", 255). ?DOC(false). -spec invert_sort_direction(sort_direction()) -> sort_direction(). invert_sort_direction(Direction) -> case Direction of ascending -> descending; descending -> ascending end. -file("src/spectator/internal/api.gleam", 262). ?DOC(false). -spec apply_direction(gleam@order:order(), sort_direction()) -> gleam@order:order(). apply_direction(Order, Direction) -> case Direction of ascending -> Order; descending -> gleam@order:negate(Order) end. -file("src/spectator/internal/api.gleam", 284). ?DOC(false). -spec compare_name(process_item(), process_item()) -> gleam@order:order(). compare_name(A, B) -> case {erlang:element(4, erlang:element(3, A)), erlang:element(4, erlang:element(3, B))} of {{some, A_name}, {some, B_name}} -> gleam@string:compare( erlang:atom_to_binary(A_name), erlang:atom_to_binary(B_name) ); {none, {some, _}} -> lt; {{some, _}, none} -> gt; {none, none} -> eq end. -file("src/spectator/internal/api.gleam", 350). ?DOC(false). -spec disgustingly_index_into_list_at(list(ABXZ), integer()) -> {ok, ABXZ} | {error, nil}. disgustingly_index_into_list_at(List, Index) -> case Index >= 0 of true -> _pipe = List, _pipe@1 = gleam@list:drop(_pipe, Index), gleam@list:first(_pipe@1); false -> {error, nil} end. -file("src/spectator/internal/api.gleam", 390). ?DOC(false). -spec sort_table_list(list(table()), table_sort_criteria(), sort_direction()) -> list(table()). sort_table_list(Input, Criteria, Direction) -> case Criteria of sort_by_table_id -> gleam@list:sort( Input, fun(A, B) -> _pipe = gleam@string:compare( gleam@string:inspect(erlang:element(2, A)), gleam@string:inspect(erlang:element(2, B)) ), apply_direction(_pipe, Direction) end ); sort_by_table_name -> gleam@list:sort( Input, fun(A@1, B@1) -> _pipe@1 = gleam@string:compare( erlang:atom_to_binary(erlang:element(3, A@1)), erlang:atom_to_binary(erlang:element(3, B@1)) ), apply_direction(_pipe@1, Direction) end ); sort_by_table_type -> gleam@list:sort( Input, fun(A@2, B@2) -> _pipe@2 = gleam@string:compare( erlang:atom_to_binary(erlang:element(4, A@2)), erlang:atom_to_binary(erlang:element(4, B@2)) ), apply_direction(_pipe@2, Direction) end ); sort_by_table_size -> gleam@list:sort( Input, fun(A@3, B@3) -> _pipe@3 = gleam@int:compare( erlang:element(5, A@3), erlang:element(5, B@3) ), apply_direction(_pipe@3, Direction) end ); sort_by_table_memory -> gleam@list:sort( Input, fun(A@4, B@4) -> _pipe@4 = gleam@int:compare( erlang:element(6, A@4), erlang:element(6, B@4) ), apply_direction(_pipe@4, Direction) end ); sort_by_table_owner -> gleam@list:sort( Input, fun(A@5, B@5) -> _pipe@5 = gleam@string:compare( gleam@string:inspect(erlang:element(7, A@5)), gleam@string:inspect(erlang:element(7, B@5)) ), apply_direction(_pipe@5, Direction) end ); sort_by_table_protection -> gleam@list:sort( Input, fun(A@6, B@6) -> _pipe@6 = gleam@string:compare( erlang:atom_to_binary(erlang:element(8, A@6)), erlang:atom_to_binary(erlang:element(8, B@6)) ), apply_direction(_pipe@6, Direction) end ); sort_by_table_read_concurrency -> gleam@list:sort( Input, fun(A@7, B@7) -> _pipe@7 = spectator@internal@common:bool_compare( erlang:element(9, A@7), erlang:element(9, B@7) ), apply_direction(_pipe@7, Direction) end ); sort_by_table_write_concurrency -> gleam@list:sort( Input, fun(A@8, B@8) -> _pipe@8 = spectator@internal@common:bool_compare( erlang:element(10, A@8), erlang:element(10, B@8) ), apply_direction(_pipe@8, Direction) end ) end. -file("src/spectator/internal/api.gleam", 457). ?DOC(false). -spec sort_port_list(list(port_item()), port_sort_criteria(), sort_direction()) -> list(port_item()). sort_port_list(Input, Criteria, Direction) -> case Criteria of sort_by_port_name -> gleam@list:sort( Input, fun(A, B) -> case {erlang:element(3, erlang:element(3, A)), erlang:element(3, erlang:element(3, B))} of {{some, A@1}, {some, B@1}} -> gleam@string:compare( erlang:atom_to_binary(A@1), erlang:atom_to_binary(B@1) ); {{some, _}, none} -> gt; {none, {some, _}} -> lt; {none, none} -> eq end end ); sort_by_port_command -> gleam@list:sort( Input, fun(A@2, B@2) -> _pipe = gleam@string:compare( erlang:element(2, erlang:element(3, A@2)), erlang:element(2, erlang:element(3, B@2)) ), apply_direction(_pipe, Direction) end ); sort_by_port_connected_process -> gleam@list:sort( Input, fun(A@3, B@3) -> _pipe@1 = gleam@string:compare( gleam@string:inspect( erlang:element(4, erlang:element(3, A@3)) ), gleam@string:inspect( erlang:element(4, erlang:element(3, B@3)) ) ), apply_direction(_pipe@1, Direction) end ); sort_by_port_os_pid -> gleam@list:sort( Input, fun(A@4, B@4) -> _pipe@2 = case {erlang:element(5, erlang:element(3, A@4)), erlang:element(5, erlang:element(3, B@4))} of {{some, A@5}, {some, B@5}} -> gleam@int:compare(A@5, B@5); {{some, _}, none} -> gt; {none, {some, _}} -> lt; {none, none} -> eq end, apply_direction(_pipe@2, Direction) end ); sort_by_port_input -> gleam@list:sort( Input, fun(A@6, B@6) -> _pipe@3 = gleam@int:compare( erlang:element(6, erlang:element(3, A@6)), erlang:element(6, erlang:element(3, B@6)) ), apply_direction(_pipe@3, Direction) end ); sort_by_port_output -> gleam@list:sort( Input, fun(A@7, B@7) -> _pipe@4 = gleam@int:compare( erlang:element(7, erlang:element(3, A@7)), erlang:element(7, erlang:element(3, B@7)) ), apply_direction(_pipe@4, Direction) end ); sort_by_port_memory -> gleam@list:sort( Input, fun(A@8, B@8) -> _pipe@5 = gleam@int:compare( erlang:element(8, erlang:element(3, A@8)), erlang:element(8, erlang:element(3, B@8)) ), apply_direction(_pipe@5, Direction) end ); sort_by_port_queue_size -> gleam@list:sort( Input, fun(A@9, B@9) -> _pipe@6 = gleam@int:compare( erlang:element(9, erlang:element(3, A@9)), erlang:element(9, erlang:element(3, B@9)) ), apply_direction(_pipe@6, Direction) end ) end. -file("src/spectator/internal/api.gleam", 528). ?DOC(false). -spec get_process_list(gleam@option:option(gleam@erlang@atom:atom_())) -> list(process_item()). get_process_list(N) -> case spectator_ffi:list_processes(N) of {ok, Items} -> Items; {error, E} -> logging:log( alert, <<"Failed to list processes, error: "/utf8, (gleam@string:inspect(E))/binary>> ), [] end. -file("src/spectator/internal/api.gleam", 545). ?DOC(false). -spec get_process_info( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> {ok, process_info()} | {error, erlang_error()}. get_process_info(Node, Pid) -> spectator_ffi:get_process_info(Node, Pid). -file("src/spectator/internal/api.gleam", 553). ?DOC(false). -spec get_details( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> {ok, process_details()} | {error, erlang_error()}. get_details(Node, Pid) -> spectator_ffi:get_details(Node, Pid). -file("src/spectator/internal/api.gleam", 561). ?DOC(false). -spec is_otp_compatible( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> boolean(). is_otp_compatible(Node, Pid) -> spectator_ffi:is_otp_compatible(Node, Pid). -file("src/spectator/internal/api.gleam", 590). ?DOC(false). -spec get_status( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_(), integer() ) -> {ok, process_otp_status()} | {error, erlang_error()}. get_status(Node, Pid, Timeout) -> spectator_ffi:get_status(Node, Pid, Timeout). -file("src/spectator/internal/api.gleam", 597). ?DOC(false). -spec get_state( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_(), integer() ) -> {ok, gleam@dynamic:dynamic_()} | {error, erlang_error()}. get_state(Node, Pid, Timeout) -> spectator_ffi:get_state(Node, Pid, Timeout). -file("src/spectator/internal/api.gleam", 563). ?DOC(false). -spec request_otp_data( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_(), fun((otp_details()) -> nil) ) -> gleam@erlang@process:pid_(). request_otp_data(Node, Proc, Callback) -> proc_lib:spawn(fun() -> case spectator_ffi:is_otp_compatible(Node, Proc) of false -> nil; true -> case spectator_ffi:get_status(Node, Proc, 100) of {error, _} -> nil; {ok, Status} -> State = begin _pipe = spectator_ffi:get_state(Node, Proc, 100), gleam@result:unwrap( _pipe, gleam@function:identity(none) ) end, Callback({otp_details, Proc, Status, State}) end end end). -file("src/spectator/internal/api.gleam", 634). ?DOC(false). -spec list_ets_tables(gleam@option:option(gleam@erlang@atom:atom_())) -> {ok, list(table())} | {error, erlang_error()}. list_ets_tables(Node) -> spectator_ffi:list_ets_tables(Node). -file("src/spectator/internal/api.gleam", 637). ?DOC(false). -spec get_ets_table_info( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@atom:atom_() ) -> {ok, table()} | {error, erlang_error()}. get_ets_table_info(Node, Name) -> spectator_ffi:get_ets_table_info(Node, Name). -file("src/spectator/internal/api.gleam", 643). ?DOC(false). -spec get_raw_ets_data( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@reference:reference_() ) -> {ok, list(list(opaque_tuple()))} | {error, erlang_error()}. get_raw_ets_data(Node, Table) -> spectator_ffi:get_ets_data(Node, Table). -file("src/spectator/internal/api.gleam", 649). ?DOC(false). -spec opaque_tuple_to_list(opaque_tuple()) -> list(gleam@dynamic:dynamic_()). opaque_tuple_to_list(Tuple) -> spectator_ffi:opaque_tuple_to_list(Tuple). -file("src/spectator/internal/api.gleam", 610). ?DOC(false). -spec process_raw_ets_data( list(list(opaque_tuple())), list(list(gleam@dynamic:dynamic_())), integer() ) -> {ok, table_data()} | {error, erlang_error()}. process_raw_ets_data(Remainder, Accumulator, Max_length) -> case Remainder of [] -> {ok, {table_data, Accumulator, Max_length}}; [[Tup] | Rest] -> Converted = spectator_ffi:opaque_tuple_to_list(Tup), process_raw_ets_data( Rest, [Converted | Accumulator], gleam@int:max(Max_length, erlang:length(Converted)) ); _ -> {error, bad_argument_error} end. -file("src/spectator/internal/api.gleam", 605). ?DOC(false). -spec get_ets_data(gleam@option:option(gleam@erlang@atom:atom_()), table()) -> {ok, table_data()} | {error, erlang_error()}. get_ets_data(Node, Table) -> gleam@result:'try'( spectator_ffi:get_ets_data(Node, erlang:element(2, Table)), fun(Raw_data) -> process_raw_ets_data(Raw_data, [], 0) end ). -file("src/spectator/internal/api.gleam", 653). ?DOC(false). -spec get_port_list(gleam@option:option(gleam@erlang@atom:atom_())) -> list(port_item()). get_port_list(Node) -> case spectator_ffi:list_ports(Node) of {ok, Items} -> Items; {error, E} -> logging:log( alert, <<"Failed to list ports, error: "/utf8, (gleam@string:inspect(E))/binary>> ), [] end. -file("src/spectator/internal/api.gleam", 667). ?DOC(false). -spec get_port_info( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@port:port_() ) -> {ok, port_info()} | {error, erlang_error()}. get_port_info(Node, Port) -> spectator_ffi:get_port_info(Node, Port). -file("src/spectator/internal/api.gleam", 673). ?DOC(false). -spec get_port_details( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@port:port_() ) -> {ok, port_details()} | {error, erlang_error()}. get_port_details(Node, Port) -> spectator_ffi:get_port_details(Node, Port). -file("src/spectator/internal/api.gleam", 681). ?DOC(false). -spec get_memory_statistics(gleam@option:option(gleam@erlang@atom:atom_())) -> {ok, memory_statistics()} | {error, erlang_error()}. get_memory_statistics(Node) -> spectator_ffi:get_memory_statistics(Node). -file("src/spectator/internal/api.gleam", 687). ?DOC(false). -spec function_to_string( {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()} ) -> binary(). function_to_string(F) -> <<<<(erlang:atom_to_binary(erlang:element(1, F)))/binary, (erlang:atom_to_binary(erlang:element(2, F)))/binary>>/binary, (erlang:integer_to_binary(erlang:element(3, F)))/binary>>. -file("src/spectator/internal/api.gleam", 269). ?DOC(false). -spec compare_tag(process_item(), process_item()) -> gleam@order:order(). compare_tag(A, B) -> case {erlang:element(8, erlang:element(3, A)), erlang:element(8, erlang:element(3, B))} of {{some, A_tag}, {some, B_tag}} -> gleam@string:compare(A_tag, B_tag); {none, {some, _}} -> lt; {{some, _}, none} -> gt; {none, none} -> gleam@string:compare( function_to_string(erlang:element(3, erlang:element(3, A))), function_to_string(erlang:element(3, erlang:element(3, B))) ) end. -file("src/spectator/internal/api.gleam", 296). ?DOC(false). -spec sort_process_list( list(process_item()), process_sort_criteria(), sort_direction() ) -> list(process_item()). sort_process_list(Input, Criteria, Direction) -> case Criteria of sort_by_process_memory -> gleam@list:sort( Input, fun(A, B) -> _pipe = gleam@int:compare( erlang:element(5, erlang:element(3, A)), erlang:element(5, erlang:element(3, B)) ), apply_direction(_pipe, Direction) end ); sort_by_reductions -> gleam@list:sort( Input, fun(A@1, B@1) -> _pipe@1 = gleam@int:compare( erlang:element(7, erlang:element(3, A@1)), erlang:element(7, erlang:element(3, B@1)) ), apply_direction(_pipe@1, Direction) end ); sort_by_message_queue -> gleam@list:sort( Input, fun(A@2, B@2) -> _pipe@2 = gleam@int:compare( erlang:element(6, erlang:element(3, A@2)), erlang:element(6, erlang:element(3, B@2)) ), apply_direction(_pipe@2, Direction) end ); sort_by_current_function -> gleam@list:sort( Input, fun(A@3, B@3) -> _pipe@3 = gleam@string:compare( function_to_string( erlang:element(2, erlang:element(3, A@3)) ), function_to_string( erlang:element(2, erlang:element(3, B@3)) ) ), apply_direction(_pipe@3, Direction) end ); sort_by_process_name -> gleam@list:sort( Input, fun(A@4, B@4) -> _pipe@4 = compare_name(A@4, B@4), apply_direction(_pipe@4, Direction) end ); sort_by_tag -> gleam@list:sort( Input, fun(A@5, B@5) -> _pipe@5 = compare_tag(A@5, B@5), apply_direction(_pipe@5, Direction) end ); sort_by_process_status -> gleam@list:sort( Input, fun(A@6, B@6) -> _pipe@6 = gleam@string:compare( erlang:atom_to_binary( erlang:element(9, erlang:element(3, A@6)) ), erlang:atom_to_binary( erlang:element(9, erlang:element(3, B@6)) ) ), apply_direction(_pipe@6, Direction) end ) end. -file("src/spectator/internal/api.gleam", 692). ?DOC(false). -spec format_pid(gleam@erlang@process:pid_()) -> binary(). format_pid(Pid) -> spectator_ffi:format_pid(Pid). -file("src/spectator/internal/api.gleam", 695). ?DOC(false). -spec format_port(gleam@erlang@port:port_()) -> binary(). format_port(Port) -> spectator_ffi:format_port(Port). -file("src/spectator/internal/api.gleam", 700). ?DOC(false). -spec kill_process( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> {ok, boolean()} | {error, erlang_error()}. kill_process(Node, Pid) -> spectator_ffi:kill_process(Node, Pid). -file("src/spectator/internal/api.gleam", 706). ?DOC(false). -spec suspend( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> {ok, gleam@dynamic:dynamic_()} | {error, erlang_error()}. suspend(Node, Pid) -> spectator_ffi:sys_suspend(Node, Pid). -file("src/spectator/internal/api.gleam", 712). ?DOC(false). -spec resume( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@process:pid_() ) -> {ok, gleam@dynamic:dynamic_()} | {error, erlang_error()}. resume(Node, Pid) -> spectator_ffi:sys_resume(Node, Pid). -file("src/spectator/internal/api.gleam", 718). ?DOC(false). -spec new_ets_table( gleam@option:option(gleam@erlang@atom:atom_()), gleam@erlang@atom:atom_() ) -> {ok, gleam@erlang@atom:atom_()} | {error, erlang_error()}. new_ets_table(Node, Name) -> spectator_ffi:new_ets_table(Node, Name). -file("src/spectator/internal/api.gleam", 726). ?DOC(false). -spec serialize_pid(gleam@erlang@process:pid_()) -> binary(). serialize_pid(Pid) -> _pipe = spectator_ffi:pid_to_string(Pid), gleam_stdlib:percent_encode(_pipe). -file("src/spectator/internal/api.gleam", 734). ?DOC(false). -spec serialize_port(gleam@erlang@port:port_()) -> binary(). serialize_port(Port) -> _pipe = spectator_ffi:port_to_string(Port), gleam_stdlib:percent_encode(_pipe). -file("src/spectator/internal/api.gleam", 742). ?DOC(false). -spec decode_pid(binary()) -> {ok, gleam@erlang@process:pid_()} | {error, nil}. decode_pid(String) -> gleam@result:'try'( gleam_stdlib:percent_decode(String), fun(Decoded) -> spectator_ffi:pid_from_string(Decoded) end ). -file("src/spectator/internal/api.gleam", 750). ?DOC(false). -spec decode_port(binary()) -> {ok, gleam@erlang@port:port_()} | {error, nil}. decode_port(String) -> gleam@result:'try'( gleam_stdlib:percent_decode(String), fun(Decoded) -> spectator_ffi:port_from_string(Decoded) end ). -file("src/spectator/internal/api.gleam", 758). ?DOC(false). -spec compare_dynamic_data(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_()) -> gleam@order:order(). compare_dynamic_data(A, B) -> spectator_ffi:compare_data(A, B). -file("src/spectator/internal/api.gleam", 363). ?DOC(false). -spec sort_table_data(table_data(), integer(), sort_direction()) -> table_data(). sort_table_data(Input, Sort_column, Sort_direction) -> Sorted = gleam@list:sort( erlang:element(2, Input), fun(A, B) -> A_cell = disgustingly_index_into_list_at(A, Sort_column), B_cell = disgustingly_index_into_list_at(B, Sort_column), case {A_cell, B_cell} of {{ok, A@1}, {ok, B@1}} -> _pipe = spectator_ffi:compare_data(A@1, B@1), apply_direction(_pipe, Sort_direction); {{ok, _}, {error, _}} -> _pipe@1 = gt, apply_direction(_pipe@1, Sort_direction); {{error, _}, {ok, _}} -> lt; {{error, _}, {error, _}} -> _pipe@2 = eq, apply_direction(_pipe@2, Sort_direction) end end ), {table_data, Sorted, erlang:element(3, Input)}. -file("src/spectator/internal/api.gleam", 764). ?DOC(false). -spec get_word_size(gleam@option:option(gleam@erlang@atom:atom_())) -> {ok, integer()} | {error, erlang_error()}. get_word_size(Node) -> spectator_ffi:get_word_size(Node). -file("src/spectator/internal/api.gleam", 767). ?DOC(false). -spec get_system_info(gleam@option:option(gleam@erlang@atom:atom_())) -> {ok, system_info()} | {error, erlang_error()}. get_system_info(Node) -> spectator_ffi:get_system_info(Node). -file("src/spectator/internal/api.gleam", 772). ?DOC(false). -spec start_tag_manager() -> {ok, gleam@erlang@process:pid_()} | {error, gleam@dynamic:dynamic_()}. start_tag_manager() -> spectator_tag_manager:start_link(). -file("src/spectator/internal/api.gleam", 775). ?DOC(false). -spec add_tag(gleam@erlang@process:pid_(), binary()) -> nil. add_tag(Pid, Tag) -> spectator_tag_manager:add_tag(Pid, Tag). -file("src/spectator/internal/api.gleam", 778). ?DOC(false). -spec get_tag(gleam@erlang@process:pid_()) -> gleam@option:option(binary()). get_tag(Pid) -> spectator_tag_manager:get_tag(Pid). -file("src/spectator/internal/api.gleam", 783). ?DOC(false). -spec hidden_connect_node(gleam@erlang@atom:atom_()) -> {ok, boolean()} | {error, erlang_error()}. hidden_connect_node(Node) -> spectator_ffi:hidden_connect_node(Node). -file("src/spectator/internal/api.gleam", 786). ?DOC(false). -spec connect_node(gleam@erlang@atom:atom_()) -> boolean(). connect_node(Node) -> net_kernel:connect_node(Node). -file("src/spectator/internal/api.gleam", 788). ?DOC(false). -spec node_from_params(list({binary(), binary()})) -> gleam@option:option(gleam@erlang@atom:atom_()). node_from_params(Params) -> case spectator@internal@common:get_param(Params, <<"node"/utf8>>) of {ok, Node_raw} -> {some, erlang:binary_to_atom(Node_raw)}; {error, _} -> none end.