use std::path::{Path, PathBuf};
const CHECKOUT_MARKERS: [&str; 2] = ["pnpm-workspace.yaml", "contracts/src/ParalockHTLC.sol"];
pub fn find_checkout(start: &Path) -> Option<PathBuf> {
start.ancestors().find(|dir| CHECKOUT_MARKERS.iter().all(|marker| dir.join(marker).exists())).map(Path::to_path_buf)
}
pub fn home_dir() -> Option<PathBuf> {
let var = if cfg!(windows) { "USERPROFILE" } else { "HOME" };
std::env::var_os(var).filter(|v| !v.is_empty()).map(PathBuf::from)
}
pub fn state_dir(cwd: &Path, paralock_home: Option<&str>) -> PathBuf {
if let Some(checkout) = find_checkout(cwd) {
return checkout.join(".paralock");
}
match paralock_home.map(str::trim).filter(|h| !h.is_empty()) {
Some(home) => cwd.join(home),
None => home_dir().unwrap_or_else(|| cwd.to_path_buf()).join(".paralock"),
}
}
pub fn current_state_dir() -> PathBuf {
let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
state_dir(&cwd, std::env::var("PARALOCK_HOME").ok().as_deref())
}
pub fn resolve_path(path: &str, base: &Path) -> PathBuf {
let expanded = match path.strip_prefix("~/") {
Some(rest) => home_dir().map_or_else(|| PathBuf::from(path), |home| home.join(rest)),
None if path == "~" => home_dir().unwrap_or_else(|| PathBuf::from(path)),
None => PathBuf::from(path),
};
if expanded.is_absolute() { expanded } else { base.join(expanded) }
}