use std::path::PathBuf; /// Minimal task runner: read nyash.toml [env] and [tasks], run the named task via shell pub(super) fn run_named_task(name: &str) -> Result<(), String> { let cfg_path = "nyash.toml"; let text = std::fs::read_to_string(cfg_path).map_err(|e| format!("read {}: {}", cfg_path, e))?; let doc = toml::from_str::(&text).map_err(|e| format!("parse {}: {}", cfg_path, e))?; // Apply [env] if let Some(env_tbl) = doc.get("env").and_then(|v| v.as_table()) { for (k, v) in env_tbl.iter() { if let Some(s) = v.as_str() { std::env::set_var(k, s); } } } // Lookup [tasks] let tasks = doc .get("tasks") .and_then(|v| v.as_table()) .ok_or("[tasks] not found in nyash.toml")?; let cmd = tasks .get(name) .and_then(|v| v.as_str()) .ok_or_else(|| format!("task '{}' not found", name))?; // Basic variable substitution let root = std::env::current_dir() .unwrap_or(PathBuf::from(".")) .display() .to_string(); let cmd = cmd.replace("{root}", &root); // Run via shell #[cfg(windows)] let status = std::process::Command::new("cmd") .args(["/C", &cmd]) .status() .map_err(|e| e.to_string())?; #[cfg(not(windows))] let status = std::process::Command::new("sh") .arg("-lc") .arg(&cmd) .status() .map_err(|e| e.to_string())?; if !status.success() { return Err(format!( "task '{}' failed with status {:?}", name, status.code() )); } Ok(()) }