use anyhow::{Context, Result};
use std::path::{Path, PathBuf};
fn find_cargo_toml(start: &Path) -> Option<PathBuf> {
let mut dir = start;
loop {
let candidate = dir.join("Cargo.toml");
if candidate.exists() {
return Some(candidate);
}
match dir.parent() {
Some(parent) => dir = parent,
None => return None,
}
}
}
pub fn workspace_root() -> Result<PathBuf> {
let cwd = std::env::current_dir().context("cannot get current directory")?;
if let Some(cargo_toml) = find_cargo_toml(&cwd) {
return Ok(cargo_toml
.parent()
.expect("Cargo.toml must have a parent")
.to_path_buf());
}
anyhow::bail!(
"Failed to locate workspace root. \
Please run `cargo worktree` inside a Cargo project."
);
}