use std::time::Duration;
use miette::miette;
use tracing::info;
use super::try_connect_daemon;
async fn reprint_status(addrs: &[std::net::SocketAddr], attempts: u32) {
println!();
for attempt in 1..=attempts {
tokio::time::sleep(Duration::from_secs(1)).await;
match super::get_status(addrs).await {
Ok(()) => return,
Err(err) if attempt == attempts => {
println!("(daemon status not available yet: {err})");
}
Err(_) => {}
}
}
}
pub async fn reload(addrs: &[std::net::SocketAddr]) -> miette::Result<()> {
let (client, url) = try_connect_daemon(addrs).await?;
let response = client
.post(format!("{url}/reload"))
.send()
.await
.map_err(|e| miette!("failed to request reload: {e}"))?;
if !response.status().is_success() {
return Err(miette!("reload endpoint returned {}", response.status()));
}
info!("connected to daemon at {url}");
println!("Reload requested.");
reprint_status(addrs, 1).await;
Ok(())
}
pub async fn restart(addrs: &[std::net::SocketAddr]) -> miette::Result<()> {
let (client, url) = try_connect_daemon(addrs).await?;
let response = client
.post(format!("{url}/restart"))
.send()
.await
.map_err(|e| miette!("failed to request restart: {e}"))?;
if !response.status().is_success() {
return Err(miette!("restart endpoint returned {}", response.status()));
}
info!("connected to daemon at {url}");
println!("Restart requested; the service manager will bring the daemon back.");
reprint_status(addrs, 20).await;
Ok(())
}