29 lines
1.4 KiB
Rust
29 lines
1.4 KiB
Rust
|
|
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::<toml::Value>(&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(())
|
||
|
|
}
|
||
|
|
|