use crate::daemon_id::DaemonId;
use crate::ipc::client::IpcClient;
use crate::pitchfork_toml::{PitchforkToml, PitchforkTomlAuto};
use crate::{Result, env};
use duct::cmd;
use itertools::Itertools;
use miette::IntoDiagnostic;
use std::collections::HashSet;
#[derive(Debug, clap::Args)]
#[clap(hide = true, verbatim_doc_comment)]
pub struct Cd {
#[clap(long)]
shell_pid: u32,
}
impl Cd {
pub async fn run(&self) -> Result<()> {
if let Ok(ipc) = IpcClient::connect(true).await {
ipc.update_shell_dir(self.shell_pid, env::CWD.clone())
.await?;
let pt = PitchforkToml::all_merged()?;
let to_start = pt
.daemons
.into_iter()
.filter(|(_id, d)| d.auto.contains(&PitchforkTomlAuto::Start))
.map(|(id, _d)| id)
.collect_vec();
if to_start.is_empty() {
return Ok(());
}
let mut args = vec![
"start".into(),
"--shell-pid".into(),
self.shell_pid.to_string(),
];
let active_daemons: HashSet<DaemonId> = ipc
.active_daemons()
.await?
.into_iter()
.map(|d| d.id)
.collect();
for id in &to_start {
if active_daemons.contains(id) {
continue;
}
args.push(id.qualified());
}
if args.len() > 3 {
cmd(&*env::PITCHFORK_BIN, args).run().into_diagnostic()?;
}
super::drain_notifications(&ipc).await;
} else {
debug!("No daemon running");
}
Ok(())
}
}