28 lines
955 B
Rust
28 lines
955 B
Rust
use std::path::Path;
|
|||
|
|
use serde_json::Value;
|
||
|
|
use anyhow::{Result, anyhow};
|
||
|
|
|
||
|
|
pub fn arg_str(args: &Value, name: &str) -> Result<String> {
|
||
|
|
args.get(name)
|
||
|
|
.and_then(|v| v.as_str())
|
||
|
|
.map(|s| s.to_string())
|
||
|
|
.ok_or_else(|| anyhow!("missing required argument: {}", name))
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn not_found_help(ctx: &super::super::ToolCtx, path: &Path, rel: &str) -> String {
|
||
|
|
let canon = path.canonicalize().unwrap_or_else(|_| path.to_path_buf());
|
||
|
|
let in_ws = ctx.workspaces.iter().any(|w| {
|
||
|
|
let wc = w.canonicalize().unwrap_or_else(|_| w.to_path_buf());
|
||
|
|
canon.starts_with(&wc)
|
||
|
|
});
|
||
|
|
if !in_ws {
|
||
|
|
format!(
|
||
|
|
"path '{}' is outside all workspace roots. Workspace roots: {}",
|
||
|
|
rel,
|
||
|
|
ctx.workspaces.iter().map(|w| w.display().to_string()).collect::<Vec<_>>().join(", ")
|
||
|
|
)
|
||
|
|
} else {
|
||
|
|
format!("path '{}' does not exist (resolved to {})", rel, canon.display())
|
||
|
|
}
|
||
|
|
}
|