#![cfg(feature = "cli")]
use anyhow::Result;
use std::{
env, fs,
path::{Path, PathBuf},
};
pub const DEVALANG_CONFIG: &str = ".devalang";
pub const DEVA_DIR: &str = ".deva";
pub fn get_cwd() -> PathBuf {
env::current_dir().unwrap_or_else(|_| PathBuf::from("."))
}
pub fn is_project_root(dir: &Path) -> bool {
let config = dir.join(DEVALANG_CONFIG);
if config.is_file() {
return true;
}
let deva = dir.join(DEVA_DIR);
deva.is_dir()
}
pub fn find_project_root_from(start: &Path) -> Option<PathBuf> {
for ancestor in start.ancestors() {
if is_project_root(ancestor) {
return Some(ancestor.to_path_buf());
}
}
None
}
pub fn find_project_root() -> Option<PathBuf> {
find_project_root_from(&get_cwd())
}
pub fn get_project_root() -> Result<PathBuf> {
find_project_root()
.ok_or_else(|| anyhow::anyhow!("Project root not found. Run 'devalang init' in your project or create a .deva directory."))
}
pub fn get_deva_dir() -> Result<PathBuf> {
let root = get_project_root()?;
Ok(root.join(DEVA_DIR))
}
pub fn ensure_deva_dir() -> Result<PathBuf> {
let deva = get_deva_dir()?;
if !deva.exists() {
fs::create_dir_all(&deva).map_err(|e| {
anyhow::anyhow!(
"Failed to create .deva directory '{}': {}",
deva.display(),
e
)
})?;
}
Ok(deva)
}
pub fn get_home_deva_dir() -> Result<PathBuf> {
let home_dir =
dirs::home_dir().ok_or_else(|| anyhow::anyhow!("Cannot determine home directory"))?;
Ok(home_dir.join(".deva"))
}
pub fn ensure_home_deva_dir() -> Result<PathBuf> {
let deva = get_home_deva_dir()?;
if !deva.exists() {
fs::create_dir_all(&deva).map_err(|e| {
anyhow::anyhow!(
"Failed to create home .deva directory '{}': {}",
deva.display(),
e
)
})?;
}
Ok(deva)
}