nexus_core/app/apps.rs
1//! The `/apps` popup's domain half: app URLs and file counts. The popup
2//! flow (browse/edit/delete state) lives in the TUI view layer.
3
4use super::App;
5
6impl App {
7 /// An app's live URL, when the server is running.
8 pub fn app_url(&self, name: &str) -> Option<String> {
9 let s = self.app_server.as_ref()?;
10 let uuid = s.registry().resolve(&self.active_space.name, name)?;
11 Some(s.app_url(&uuid))
12 }
13
14 /// How many files an app holds (recursive; `node_modules` counted as one
15 /// "deps" marker would be noise, so it's skipped entirely).
16 pub fn app_file_count(&self, name: &str) -> usize {
17 fn count(dir: &std::path::Path) -> usize {
18 let Ok(rd) = std::fs::read_dir(dir) else {
19 return 0;
20 };
21 rd.flatten()
22 .map(|e| {
23 let p = e.path();
24 if p.is_dir() {
25 if e.file_name() == "node_modules" {
26 0
27 } else {
28 count(&p)
29 }
30 } else {
31 1
32 }
33 })
34 .sum()
35 }
36 count(&self.space.apps_dir(&self.active_space.name).join(name))
37 }
38}