summaryrefslogtreecommitdiff
path: root/legacy_data/src/env.rs
diff options
context:
space:
mode:
Diffstat (limited to 'legacy_data/src/env.rs')
-rw-r--r--legacy_data/src/env.rs84
1 files changed, 84 insertions, 0 deletions
diff --git a/legacy_data/src/env.rs b/legacy_data/src/env.rs
new file mode 100644
index 0000000..209c0cc
--- /dev/null
+++ b/legacy_data/src/env.rs
@@ -0,0 +1,84 @@
+use crate::constants::*;
+use std::io::{self, Error};
+use std::{env::set_current_dir, path::PathBuf};
+
+/// Find the nearest vault or local workspace and correct the `current_dir` to it
+pub fn correct_current_dir() -> Result<(), io::Error> {
+ if let Some(local_workspace) = current_local_path() {
+ set_current_dir(local_workspace)?;
+ return Ok(());
+ }
+ if let Some(vault) = current_vault_path() {
+ set_current_dir(vault)?;
+ return Ok(());
+ }
+ Err(Error::new(
+ io::ErrorKind::NotFound,
+ "Could not find any vault or local workspace!",
+ ))
+}
+
+/// Get the nearest Vault directory from `current_dir`
+pub fn current_vault_path() -> Option<PathBuf> {
+ let current_dir = std::env::current_dir().ok()?;
+ find_vault_path(current_dir)
+}
+
+/// Get the nearest local workspace from `current_dir`
+pub fn current_local_path() -> Option<PathBuf> {
+ let current_dir = std::env::current_dir().ok()?;
+ find_local_path(current_dir)
+}
+
+/// Get the nearest Vault directory from the specified path
+pub fn find_vault_path(path: impl Into<PathBuf>) -> Option<PathBuf> {
+ let mut current_path = path.into();
+ let vault_file = SERVER_FILE_VAULT;
+
+ loop {
+ let vault_toml_path = current_path.join(vault_file);
+ if vault_toml_path.exists() {
+ return Some(current_path);
+ }
+
+ if let Some(parent) = current_path.parent() {
+ current_path = parent.to_path_buf();
+ } else {
+ break;
+ }
+ }
+
+ None
+}
+
+/// Get the nearest local workspace from the specified path
+pub fn find_local_path(path: impl Into<PathBuf>) -> Option<PathBuf> {
+ let mut current_path = path.into();
+ let workspace_dir = CLIENT_PATH_WORKSPACE_ROOT;
+
+ loop {
+ let jvc_path = current_path.join(workspace_dir);
+ if jvc_path.exists() {
+ return Some(current_path);
+ }
+
+ if let Some(parent) = current_path.parent() {
+ current_path = parent.to_path_buf();
+ } else {
+ break;
+ }
+ }
+
+ None
+}
+
+/// Get the system's document directory and join with the appropriate application name
+pub fn current_cfg_dir() -> Option<PathBuf> {
+ dirs::config_local_dir().map(|path| {
+ if cfg!(target_os = "linux") {
+ path.join("jvcs")
+ } else {
+ path.join("JustEnoughVCS")
+ }
+ })
+}