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:
Graham McIntire 2026-04-23 14:57:30 -05:00
parent f86c185f27
commit 48943cdc52
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59

View file

@ -125,50 +125,40 @@ defmodule Aprsme.Is do
end end
def get_status do def get_status do
case Process.whereis(__MODULE__) do status_from(Process.whereis(__MODULE__))
nil -> end
# 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()
%{ # GenServer isn't running — return a disconnected snapshot.
connected: false, defp status_from(nil), do: disconnected_status(nil)
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
}
_pid -> defp status_from(pid) when is_pid(pid) do
try do GenServer.call(__MODULE__, :get_status, 5000)
GenServer.call(__MODULE__, :get_status, 5000) catch
catch # GenServer exists but isn't responding — treat as disconnected but
:exit, _ -> # fall back to the rotate.aprs2.net default server string.
# GenServer exists but not responding :exit, _ -> disconnected_status(~c"rotate.aprs2.net")
server = Application.get_env(:aprsme, :aprs_is_server, ~c"rotate.aprs2.net") end
port = Application.get_env(:aprsme, :aprs_is_port, 14_580)
{stored_packet_count, oldest_packet_timestamp} = safe_packet_storage_stats()
%{ # Build the "I'm not connected" status map. `default_server` is only used
connected: false, # when the application config has no server set; pass nil to mean "use
server: server_to_string(server), # whatever is in config, or nil".
port: port, defp disconnected_status(default_server) do
connected_at: nil, server = Application.get_env(:aprsme, :aprs_is_server, default_server)
uptime_seconds: 0, port = Application.get_env(:aprsme, :aprs_is_port, 14_580)
login_id: Application.get_env(:aprsme, :aprs_is_login_id, "W5ISP"), {stored_packet_count, oldest_packet_timestamp} = safe_packet_storage_stats()
filter: Application.get_env(:aprsme, :aprs_is_default_filter, "r/33/-96/100"),
packet_stats: default_packet_stats(), %{
stored_packet_count: stored_packet_count, connected: false,
oldest_packet_timestamp: oldest_packet_timestamp server: server_to_string(server),
} port: port,
end connected_at: nil,
end 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
defp safe_packet_storage_stats do defp safe_packet_storage_stats do