Added tool implementation for reading tools.

This commit is contained in:
2026-06-23 20:36:16 +08:00
parent 132089c8eb
commit 3476d8cbcb
6 changed files with 441 additions and 11 deletions
+34 -10
View File
@@ -188,18 +188,42 @@ fn build_tool(tool_dir: &Path, tool_name: &str) -> Result<(), String> {
Ok(())
}
/// 定位 tools 根目录。
///
/// 产物可能位于两处之一:
/// - `tools/bin/tool_manager`(统一产物目录,registry 优先使用)
/// - `tools/tool_manager/target/release/tool_manager`(构建产物)
///
/// 因此不依赖固定向上层数,而是从 exe 向上找第一个“含 bin/ 子目录且至少含一个
/// 工具子目录”的祖先,即为 tools 根。对两种位置均正确。
fn locate_tools_root() -> Result<PathBuf, String> {
let exe = std::env::current_exe().map_err(|e| e.to_string())?;
// exe = tools/tool_manager/target/release/tool_manager
let tool_dir = exe
.parent() // .../target/release
.and_then(Path::parent) // .../target
.and_then(Path::parent) // .../tool_manager
.ok_or_else(|| "无法定位 tool_manager 目录".to_string())?;
tool_dir
.parent()
.map(Path::to_path_buf)
.ok_or_else(|| "无法定位 tools 根目录".to_string())
let mut cur = exe.parent();
while let Some(dir) = cur {
if dir.join("bin").is_dir() && has_tool_subdir(dir) {
return Ok(dir.to_path_buf());
}
cur = dir.parent();
}
Err("无法定位 tools 根目录".into())
}
/// 判断目录下是否存在至少一个工具子目录(含 specs/Cargo.toml/src 之一)
fn has_tool_subdir(dir: &Path) -> bool {
let Ok(entries) = fs::read_dir(dir) else {
return false;
};
for entry in entries.flatten() {
let p = entry.path();
if p.is_dir()
&& (p.join("specs").exists()
|| p.join("Cargo.toml").exists()
|| p.join("src").exists())
{
return true;
}
}
false
}
fn cargo_toml(tool_name: &str) -> String {