pitchfork_cli/
daemon_list.rs1use crate::Result;
2use crate::daemon::Daemon;
3use crate::daemon_id::DaemonId;
4use crate::daemon_status::DaemonStatus;
5use crate::ipc::client::IpcClient;
6use crate::pitchfork_toml::PitchforkToml;
7use crate::settings::settings;
8use std::collections::HashSet;
9
10#[derive(Debug, Clone)]
12pub struct DaemonListEntry {
13 pub id: DaemonId,
14 pub daemon: Daemon,
15 pub is_disabled: bool,
16 pub is_available: bool, }
18
19pub async fn get_all_daemons(client: &IpcClient) -> Result<Vec<DaemonListEntry>> {
35 let config = PitchforkToml::all_merged()?;
36
37 let state_file = crate::state_file::StateFile::read(&*crate::env::PITCHFORK_STATE_FILE)?;
39 let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
40
41 let disabled_daemons = client.get_disabled_daemons().await?;
42 let disabled_set: HashSet<DaemonId> = disabled_daemons.into_iter().collect();
43
44 build_daemon_list(state_daemons, disabled_set, config)
45}
46
47pub async fn get_all_daemons_direct(
58 supervisor: &crate::supervisor::Supervisor,
59) -> Result<Vec<DaemonListEntry>> {
60 let config = PitchforkToml::all_merged()?;
61
62 let state_file = supervisor.state_file.lock().await;
65 let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
66 let disabled_set: HashSet<DaemonId> = state_file.disabled.clone().into_iter().collect();
67 drop(state_file); build_daemon_list(state_daemons, disabled_set, config)
70}
71
72fn build_daemon_list(
74 state_daemons: Vec<Daemon>,
75 disabled_set: HashSet<DaemonId>,
76 config: PitchforkToml,
77) -> Result<Vec<DaemonListEntry>> {
78 let mut entries = Vec::new();
79 let mut seen_ids = HashSet::new();
80
81 let pitchfork_id = DaemonId::pitchfork();
83
84 for daemon in state_daemons {
86 if daemon.id == pitchfork_id {
87 continue; }
89
90 seen_ids.insert(daemon.id.clone());
95 entries.push(DaemonListEntry {
96 id: daemon.id.clone(),
97 is_disabled: disabled_set.contains(&daemon.id),
98 is_available: false,
99 daemon,
100 });
101 }
102
103 for (daemon_id, daemon_config) in &config.daemons {
105 if *daemon_id == pitchfork_id || seen_ids.contains(daemon_id) {
106 continue;
107 }
108
109 let placeholder = Daemon {
111 id: daemon_id.clone(),
112 status: DaemonStatus::Stopped,
113 port_bump_attempts: settings().default_port_bump_attempts(),
114 depends: vec![],
115 env: None,
116 watch: vec![],
117 watch_base_dir: None,
118 mise: daemon_config.mise,
119 active_port: None,
120 slug: None,
121 proxy: None,
122 memory_limit: daemon_config.memory_limit,
123 cpu_limit: daemon_config.cpu_limit,
124 ..Daemon::default()
125 };
126
127 entries.push(DaemonListEntry {
128 id: daemon_id.clone(),
129 daemon: placeholder,
130 is_disabled: disabled_set.contains(daemon_id),
131 is_available: true,
132 });
133 }
134
135 Ok(entries)
136}