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 std::collections::HashSet;
8
9#[derive(Debug, Clone)]
11pub struct DaemonListEntry {
12 pub id: DaemonId,
13 pub daemon: Daemon,
14 pub is_disabled: bool,
15 pub is_available: bool, }
17
18pub async fn get_all_daemons(client: &IpcClient) -> Result<Vec<DaemonListEntry>> {
34 let config = PitchforkToml::all_merged()?;
35
36 let state_file = crate::state_file::StateFile::read(&*crate::env::PITCHFORK_STATE_FILE)?;
38 let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
39
40 let disabled_daemons = client.get_disabled_daemons().await?;
41 let disabled_set: HashSet<DaemonId> = disabled_daemons.into_iter().collect();
42
43 build_daemon_list(state_daemons, disabled_set, config)
44}
45
46pub async fn get_all_daemons_direct(
57 supervisor: &crate::supervisor::Supervisor,
58) -> Result<Vec<DaemonListEntry>> {
59 let config = PitchforkToml::all_merged()?;
60
61 let state_file = supervisor.state_file.lock().await;
64 let state_daemons: Vec<Daemon> = state_file.daemons.values().cloned().collect();
65 let disabled_set: HashSet<DaemonId> = state_file.disabled.clone().into_iter().collect();
66 drop(state_file); build_daemon_list(state_daemons, disabled_set, config)
69}
70
71fn build_daemon_list(
73 state_daemons: Vec<Daemon>,
74 disabled_set: HashSet<DaemonId>,
75 config: PitchforkToml,
76) -> Result<Vec<DaemonListEntry>> {
77 let mut entries = Vec::new();
78 let mut seen_ids = HashSet::new();
79
80 let pitchfork_id = DaemonId::pitchfork();
82
83 for daemon in state_daemons {
85 if daemon.id == pitchfork_id {
86 continue; }
88
89 seen_ids.insert(daemon.id.clone());
94 entries.push(DaemonListEntry {
95 id: daemon.id.clone(),
96 is_disabled: disabled_set.contains(&daemon.id),
97 is_available: false,
98 daemon,
99 });
100 }
101
102 for (daemon_id, daemon_config) in &config.daemons {
104 if *daemon_id == pitchfork_id || seen_ids.contains(daemon_id) {
105 continue;
106 }
107
108 let placeholder = Daemon {
110 id: daemon_id.clone(),
111 status: DaemonStatus::Stopped,
112 port: daemon_config.port.clone(),
113 depends: vec![],
114 env: None,
115 watch: vec![],
116 watch_mode: daemon_config.watch_mode,
117 watch_base_dir: None,
118 mise: daemon_config.mise,
119 user: daemon_config.user.clone(),
120 active_port: None,
121 slug: None,
122 proxy: None,
123 memory_limit: daemon_config.memory_limit,
124 cpu_limit: daemon_config.cpu_limit,
125 ..Daemon::default()
126 };
127
128 entries.push(DaemonListEntry {
129 id: daemon_id.clone(),
130 daemon: placeholder,
131 is_disabled: disabled_set.contains(daemon_id),
132 is_available: true,
133 });
134 }
135
136 Ok(entries)
137}