refactor: Is.get_status pattern-matches on process presence
The original get_status/0 had a nested case/try that duplicated the "disconnected" status map across two branches. Split into: - status_from/1 with nil + is_pid heads for the "no GenServer" and "GenServer alive" paths. The alive path isolates the catch :exit, _ fallback for a non-responding process. - disconnected_status/1 builds the shared status map once, parameterised on the default server string to preserve the original branch-specific fallback behavior. Removes ~20 duplicated lines; all 61 Is tests still pass.
This commit is contained in:
parent
f86c185f27
commit
48943cdc52
1 changed files with 31 additions and 41 deletions
|
|
@ -125,50 +125,40 @@ defmodule Aprsme.Is do
|
|||
end
|
||||
|
||||
def get_status do
|
||||
case Process.whereis(__MODULE__) do
|
||||
nil ->
|
||||
# GenServer is not running (disconnected)
|
||||
server = Application.get_env(:aprsme, :aprs_is_server, nil)
|
||||
port = Application.get_env(:aprsme, :aprs_is_port, 14_580)
|
||||
{stored_packet_count, oldest_packet_timestamp} = safe_packet_storage_stats()
|
||||
status_from(Process.whereis(__MODULE__))
|
||||
end
|
||||
|
||||
%{
|
||||
connected: false,
|
||||
server: server_to_string(server),
|
||||
port: port,
|
||||
connected_at: nil,
|
||||
uptime_seconds: 0,
|
||||
login_id: Application.get_env(:aprsme, :aprs_is_login_id, "W5ISP"),
|
||||
filter: Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100"),
|
||||
packet_stats: default_packet_stats(),
|
||||
stored_packet_count: stored_packet_count,
|
||||
oldest_packet_timestamp: oldest_packet_timestamp
|
||||
}
|
||||
# GenServer isn't running — return a disconnected snapshot.
|
||||
defp status_from(nil), do: disconnected_status(nil)
|
||||
|
||||
_pid ->
|
||||
try do
|
||||
GenServer.call(__MODULE__, :get_status, 5000)
|
||||
catch
|
||||
:exit, _ ->
|
||||
# GenServer exists but not responding
|
||||
server = Application.get_env(:aprsme, :aprs_is_server, ~c"rotate.aprs2.net")
|
||||
port = Application.get_env(:aprsme, :aprs_is_port, 14_580)
|
||||
{stored_packet_count, oldest_packet_timestamp} = safe_packet_storage_stats()
|
||||
defp status_from(pid) when is_pid(pid) do
|
||||
GenServer.call(__MODULE__, :get_status, 5000)
|
||||
catch
|
||||
# GenServer exists but isn't responding — treat as disconnected but
|
||||
# fall back to the rotate.aprs2.net default server string.
|
||||
:exit, _ -> disconnected_status(~c"rotate.aprs2.net")
|
||||
end
|
||||
|
||||
%{
|
||||
connected: false,
|
||||
server: server_to_string(server),
|
||||
port: port,
|
||||
connected_at: nil,
|
||||
uptime_seconds: 0,
|
||||
login_id: Application.get_env(:aprsme, :aprs_is_login_id, "W5ISP"),
|
||||
filter: Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100"),
|
||||
packet_stats: default_packet_stats(),
|
||||
stored_packet_count: stored_packet_count,
|
||||
oldest_packet_timestamp: oldest_packet_timestamp
|
||||
}
|
||||
end
|
||||
end
|
||||
# Build the "I'm not connected" status map. `default_server` is only used
|
||||
# when the application config has no server set; pass nil to mean "use
|
||||
# whatever is in config, or nil".
|
||||
defp disconnected_status(default_server) do
|
||||
server = Application.get_env(:aprsme, :aprs_is_server, default_server)
|
||||
port = Application.get_env(:aprsme, :aprs_is_port, 14_580)
|
||||
{stored_packet_count, oldest_packet_timestamp} = safe_packet_storage_stats()
|
||||
|
||||
%{
|
||||
connected: false,
|
||||
server: server_to_string(server),
|
||||
port: port,
|
||||
connected_at: nil,
|
||||
uptime_seconds: 0,
|
||||
login_id: Application.get_env(:aprsme, :aprs_is_login_id, "W5ISP"),
|
||||
filter: Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100"),
|
||||
packet_stats: default_packet_stats(),
|
||||
stored_packet_count: stored_packet_count,
|
||||
oldest_packet_timestamp: oldest_packet_timestamp
|
||||
}
|
||||
end
|
||||
|
||||
defp safe_packet_storage_stats do
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue