mod platform;
mod response;
#[cfg(test)]
mod tests;
use crate::config::Config;
use anyhow::Result;
use serde_json::{Value, json};
use std::env;
use platform::{detect_platform, extract_command, split_env_prefix};
use response::{format_allow, format_modify};
pub fn handle(config: &Config, input: &str) -> Result<String> {
let platform = detect_platform()?;
let parsed: Value = serde_json::from_str(input).unwrap_or(json!({}));
let raw = match extract_command(&parsed) {
Some(cmd) => cmd,
None => return Ok(format_allow(&platform)),
};
let (env_prefix, command) = split_env_prefix(&raw);
if command.starts_with("lade inject") {
return Ok(format_allow(&platform));
}
let matches = config.collect(&command);
if matches.is_empty() {
return Ok(format_allow(&platform));
}
let lade_bin = env::current_exe()
.map(|p| p.display().to_string())
.unwrap_or_else(|_| "lade".to_string());
let escaped = command.replace('\'', "'\\''");
let new_command = if env_prefix.is_empty() {
format!("{} inject '{}'", lade_bin, escaped)
} else {
format!("{} {} inject '{}'", env_prefix, lade_bin, escaped)
};
let tool_input = parsed.get("tool_input").cloned().unwrap_or(json!({}));
Ok(format_modify(&platform, &tool_input, &new_command))
}