use crate::Result;
use crate::cli::list::build_proxy_url;
use crate::pitchfork_toml::PitchforkToml;
use crate::settings::settings;
use crate::state_file::StateFile;
#[derive(Debug, clap::Args)]
#[clap(
visible_alias = "stat",
verbatim_doc_comment,
long_about = "\
Display the status of a daemon
Shows detailed information about a single daemon including its PID and
current status (running, stopped, failed, etc.).
Example:
pitchfork status api
Output:
Name: api
PID: 12345
Status: running"
)]
pub struct Status {
pub id: String,
}
impl Status {
pub async fn run(&self) -> Result<()> {
let qualified_id = PitchforkToml::resolve_id(&self.id)?;
let global_slugs = settings()
.proxy
.enable
.then(PitchforkToml::read_global_slugs)
.unwrap_or_default();
let daemon = StateFile::get().daemons.get(&qualified_id);
if let Some(daemon) = daemon {
println!("Name: {qualified_id}");
if let Some(pid) = &daemon.pid {
println!("PID: {pid}");
}
println!("Status: {}", daemon.status.style());
if let Some(port) = daemon.active_port {
println!("Port: {port} (active)");
} else if !daemon.resolved_port.is_empty() {
let ports = daemon
.resolved_port
.iter()
.map(|p| p.to_string())
.collect::<Vec<_>>()
.join(", ");
println!("Port: {ports}");
}
let s = settings();
if s.proxy.enable && (daemon.active_port.is_some() || !daemon.resolved_port.is_empty())
{
let slug =
PitchforkToml::find_slug_for_daemon_in_registry(&qualified_id, &global_slugs);
if let Some(url) = build_proxy_url(slug.as_deref(), s) {
println!("Proxy: {url}");
}
}
} else {
miette::bail!("Daemon {} not found", qualified_id);
}
Ok(())
}
}