Current section

Files

Jump to
observer_cli src observer_cli_command.erl
Raw

src/observer_cli_command.erl

%%% @author zhongwen <zhongwencool@gmail.com>
-module(observer_cli_command).
-include("observer_cli.hrl").
-export([parse_shared/1]).
-export([parse_integer/1]).
-spec parse_shared(term()) -> atom() | string() | tuple().
parse_shared(Key) ->
case Key of
"H\n" ->
home_view;
"S\n" ->
system_view;
"A\n" ->
app_view;
"N\n" ->
inet_view;
"O\n" ->
ports_view;
"K\n" ->
sockets_view;
"M\n" ->
mnesia_view;
"E\n" ->
ets_view;
"D\n" ->
help_view;
"P\n" ->
plugin_view;
%% inet
"ic\n" ->
inet_count;
"iw\n" ->
inet_window;
"rc\n" ->
recv_cnt;
"ro\n" ->
recv_oct;
"sc\n" ->
send_cnt;
"so\n" ->
send_oct;
"cnt\n" ->
cnt;
"oct\n" ->
oct;
"qs\n" ->
queue_size;
"io\n" ->
socket_io;
"rb\n" ->
socket_read_byte;
"wb\n" ->
socket_write_byte;
"pk\n" ->
socket_packets;
"wt\n" ->
socket_waits;
"fl\n" ->
socket_fails;
"mx\n" ->
socket_max_packet;
"ac\n" ->
socket_accepts;
"id\n" ->
socket_id;
"fd\n" ->
socket_fd;
"ow\n" ->
socket_owner;
"dm\n" ->
socket_domain;
"tp\n" ->
socket_type;
"pt\n" ->
socket_protocol;
Cmd when Cmd =:= "q\n"; Cmd =:= "Q\n" ->
quit;
Cmd when Cmd =:= "pu\n"; Cmd =:= "PU\n"; Cmd =:= "B\n" ->
page_up_top_n;
Cmd when Cmd =:= "pd\n"; Cmd =:= "PD\n"; Cmd =:= "F\n" ->
page_down_top_n;
%% home
"p\n" ->
pause_or_resume;
"r\n" ->
{func, proc_count, reductions};
"b\n" ->
{func, proc_count, binary_memory};
"t\n" ->
{func, proc_count, total_heap_size};
"m\n" ->
{func, proc_count, memory};
"mq\n" ->
{func, proc_count, message_queue_len};
"rr\n" ->
{func, proc_window, reductions};
"bb\n" ->
{func, proc_window, binary_memory};
"tt\n" ->
{func, proc_window, total_heap_size};
"mm\n" ->
{func, proc_window, memory};
"mmq\n" ->
{func, proc_window, message_queue_len};
"\n" ->
jump;
"s\n" ->
size;
"hide\n" ->
hide;
"`\n" ->
scheduler_usage;
[PidMark | PidStr] when PidMark =:= $<; PidMark =:= $> ->
to_pid(PidStr);
%% {error, estale}|{error, terminated}
{error, _Reason} ->
quit;
Number ->
parse_integer(Number)
end.
-spec parse_integer(string()) -> {term(), term()}.
parse_integer(Number) ->
case string:to_integer(Number) of
{error, _Reason} ->
{input_str, Number -- "\n"};
{Integer, _} ->
if
Integer >= ?MIN_INTERVAL ->
{new_interval, Integer};
Integer > 0 ->
{jump, Integer};
true ->
{input_str, Number -- "\n"}
end
end.
-spec to_pid(string()) -> {go_to_pid, pid()} | quit.
to_pid(Str) ->
try
case string:tokens(Str, ".<>\n") of
[X, Y, Z] ->
{go_to_pid, list_to_pid("<" ++ X ++ "." ++ Y ++ "." ++ Z ++ ">")};
[Y] ->
{go_to_pid, list_to_pid("<0." ++ Y ++ ".0>")};
_ ->
quit
end
catch
error:badarg -> quit;
error:system_limit -> quit
end.