use crate::Result;
use crate::daemon::Daemon;
use crate::daemon_id::DaemonId;
use crate::daemon_status::DaemonStatus;
use crate::ipc::client::IpcClient;
use crate::pitchfork_toml::PitchforkToml;
use crate::settings::settings;
use std::collections::HashSet;
#[derive(Debug, Clone)]
pub struct DaemonListEntry {
pub id: DaemonId,
pub daemon: Daemon,
pub is_disabled: bool,
pub is_available: bool, }
pub async fn get_all_daemons(client: &IpcClient) -> Result<Vec<DaemonListEntry>> {
let config = PitchforkToml::all_merged()?;
let state_file = crate::state_file::StateFile::read(&*crate::env::PITCHFORK_STATE_FILE)?;
let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
let disabled_daemons = client.get_disabled_daemons().await?;
let disabled_set: HashSet<DaemonId> = disabled_daemons.into_iter().collect();
build_daemon_list(state_daemons, disabled_set, config)
}
pub async fn get_all_daemons_direct(
supervisor: &crate::supervisor::Supervisor,
) -> Result<Vec<DaemonListEntry>> {
let config = PitchforkToml::all_merged()?;
let state_file = supervisor.state_file.lock().await;
let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
let disabled_set: HashSet<DaemonId> = state_file.disabled.clone().into_iter().collect();
drop(state_file);
build_daemon_list(state_daemons, disabled_set, config)
}
fn build_daemon_list(
state_daemons: Vec<Daemon>,
disabled_set: HashSet<DaemonId>,
config: PitchforkToml,
) -> Result<Vec<DaemonListEntry>> {
let mut entries = Vec::new();
let mut seen_ids = HashSet::new();
let pitchfork_id = DaemonId::pitchfork();
for daemon in state_daemons {
if daemon.id == pitchfork_id {
continue; }
seen_ids.insert(daemon.id.clone());
entries.push(DaemonListEntry {
id: daemon.id.clone(),
is_disabled: disabled_set.contains(&daemon.id),
is_available: false,
daemon,
});
}
for (daemon_id, daemon_config) in &config.daemons {
if *daemon_id == pitchfork_id || seen_ids.contains(daemon_id) {
continue;
}
let placeholder = Daemon {
id: daemon_id.clone(),
status: DaemonStatus::Stopped,
port_bump_attempts: settings().default_port_bump_attempts(),
depends: vec![],
env: None,
watch: vec![],
watch_base_dir: None,
mise: daemon_config.mise,
active_port: None,
slug: None,
proxy: None,
memory_limit: daemon_config.memory_limit,
cpu_limit: daemon_config.cpu_limit,
..Daemon::default()
};
entries.push(DaemonListEntry {
id: daemon_id.clone(),
daemon: placeholder,
is_disabled: disabled_set.contains(daemon_id),
is_available: true,
});
}
Ok(entries)
}