use crate::cli::output::OutputConfig;
use anyhow::{Context, Result};
use std::net::SocketAddr;
pub async fn handle(http: SocketAddr, _out: &OutputConfig) -> Result<()> {
if let Some(addr) = running_daemon_addr() {
println!("Daemon already running: http://{addr}");
return Ok(());
}
let exe = std::env::current_exe().context("resolving current executable path")?;
let child = std::process::Command::new(&exe)
.arg("serve")
.arg("--http")
.arg(http.to_string())
.stdin(std::process::Stdio::null())
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.spawn()
.context("spawning detached `trusty-memory serve` process")?;
println!("Started trusty-memory daemon (pid {})…", child.id());
let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5);
while std::time::Instant::now() < deadline {
tokio::time::sleep(std::time::Duration::from_millis(200)).await;
if let Some(addr) = running_daemon_addr() {
println!("Daemon ready: http://{addr}");
return Ok(());
}
}
println!("Daemon did not report ready within 5 s; check `trusty-memory status`.");
Ok(())
}
fn running_daemon_addr() -> Option<String> {
let addr = trusty_common::read_daemon_addr("trusty-memory")
.ok()
.flatten()?;
if addr.is_empty() {
return None;
}
let sa: SocketAddr = addr.parse().ok()?;
std::net::TcpStream::connect_timeout(&sa, std::time::Duration::from_millis(300)).ok()?;
Some(addr)
}