pitchfork-cli 2.6.0

Daemons with DX
Documentation
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(())
    }
}