diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-28 16:18:12 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-28 16:18:12 +0800 |
| commit | 881e7399b2417c32fa996d94c6b389c1e06d8eb1 (patch) | |
| tree | fd88cb181e9c5a0bae8677c43dff859f4cd82d80 /mling/src/namespace_manager.rs | |
| parent | dbc811d84fd809ea606a8bbed84b3e78e8cda334 (diff) | |
Add scaffolding CLI tool `mling`
Diffstat (limited to 'mling/src/namespace_manager.rs')
| -rw-r--r-- | mling/src/namespace_manager.rs | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/mling/src/namespace_manager.rs b/mling/src/namespace_manager.rs new file mode 100644 index 0000000..4d36136 --- /dev/null +++ b/mling/src/namespace_manager.rs @@ -0,0 +1,113 @@ +use std::path::PathBuf; + +use just_fmt::kebab_case; + +pub fn list_namespaces( + show_trusted: bool, + show_untrusted: bool, + show_untagged: bool, +) -> Vec<String> { + let wdir = working_dir(); + if !wdir.exists() { + return Vec::new(); + } + + let mut namespaces = Vec::new(); + let entries = match std::fs::read_dir(&wdir) { + Ok(entries) => entries, + Err(_) => return Vec::new(), + }; + for entry in entries { + let entry = match entry { + Ok(e) => e, + Err(_) => continue, + }; + let path = entry.path(); + if path.is_dir() { + if let Some(name) = path.file_name() { + if let Some(name_str) = name.to_str() { + // Skip directories starting with a dot + if name_str.starts_with('.') { + continue; + } + let namespace = name_str.to_string(); + let is_trusted = is_trusted_namespace(namespace.clone()); + let is_untrusted = is_untrusted_namespace(namespace.clone()); + let is_untagged = is_untagged_namespace(namespace.clone()); + + if (show_trusted && is_trusted) + || (show_untrusted && is_untrusted) + || (show_untagged && is_untagged) + { + namespaces.push(namespace); + } + } + } + } + } + + namespaces +} + +pub fn set_namespace_trusted(namespace: String, trusted: bool) { + let ndir = namespace_dir(namespace); + let trusted_file = ndir.join("TRUSTED"); + let untrusted_file = ndir.join("UNTRUSTED"); + + if trusted { + // Create TRUSTED file and remove UNTRUSTED if it exists + let _ = std::fs::write(&trusted_file, ""); + let _ = std::fs::remove_file(&untrusted_file); + } else { + // Remove TRUSTED file + let _ = std::fs::remove_file(&trusted_file); + } +} + +pub fn remove_namespace(namespace: String) { + let ndir = namespace_dir(namespace); + if ndir.exists() { + let _ = std::fs::remove_dir_all(&ndir); + } +} + +pub fn working_dir() -> PathBuf { + dirs::data_dir().unwrap().join("mingling") +} + +pub fn namespace_dir(namespace: String) -> PathBuf { + working_dir().join(kebab_case!(namespace)) +} + +pub fn is_untrusted_namespace(namespace: String) -> bool { + let untrusted_file = namespace_dir(namespace).join("UNTRUSTED"); + untrusted_file.exists() +} + +pub fn is_trusted_namespace(namespace: String) -> bool { + let trusted = namespace_dir(namespace).join("TRUSTED"); + trusted.exists() +} + +pub fn is_untagged_namespace(namespace: String) -> bool { + let ndir = namespace_dir(namespace); + let trusted = ndir.join("TRUSTED"); + let untrusted = ndir.join("UNTRUSTED"); + !trusted.exists() && !untrusted.exists() +} + +pub fn bin_dir(namespace: String) -> PathBuf { + namespace_dir(namespace).join("bin") +} + +pub fn comp_dir(namespace: String) -> PathBuf { + namespace_dir(namespace).join("comp") +} + +pub fn exe_path(namespace: String, bin_name_without_ext: String) -> PathBuf { + if cfg!(target_os = "windows") { + bin_dir(namespace).join(bin_name_without_ext + ".exe") + } else { + bin_dir(namespace).join(bin_name_without_ext) + } +} |
