use anyhow::Context;
use std::path::{Path, PathBuf};
pub fn find_project_root(start: &Path) -> Option<PathBuf> {
let mut dir = start;
loop {
let gobby_dir = dir.join(".gobby");
if gobby_dir.join("project.json").exists() || gobby_dir.join("gcode.json").exists() {
return Some(dir.to_path_buf());
}
match dir.parent() {
Some(parent) => dir = parent,
None => return None,
}
}
}
pub fn read_project_id(project_root: &Path) -> anyhow::Result<String> {
let path = project_root.join(".gobby").join("project.json");
let contents = std::fs::read_to_string(&path)
.with_context(|| format!("failed to read {}", path.display()))?;
let json: serde_json::Value = serde_json::from_str(&contents)?;
json.get("id")
.or_else(|| json.get("project_id"))
.and_then(|v| v.as_str())
.map(String::from)
.context("'id' field not found in .gobby/project.json")
}