use std::path::PathBuf;
use std::process::Command;
use crate::bridge::{find_addon, find_node, write_temp_config};
use crate::compile::{compile_config, load_config};
use crate::error::DocusaurusError;
pub struct RunnerOptions {
pub site_dir: PathBuf,
pub cli_options: serde_json::Value,
}
pub fn run_command(command: &str, opts: RunnerOptions) -> Result<(), DocusaurusError> {
let dylib = compile_config(&opts.site_dir)?;
let config = load_config(&dylib)?;
let config_json = serde_json::to_string(&config)?;
let (_temp_file, config_path) = write_temp_config(&config_json)?;
let node = find_node()?;
let addon = find_addon(&opts.site_dir)?;
let site_dir_str = opts.site_dir.display().to_string();
let config_path_str = config_path.display().to_string();
let addon_path_str = addon.display().to_string();
let cli_options_json = opts.cli_options.to_string();
let escaped_opts = cli_options_json
.replace('\\', r"\\")
.replace('\'', r"\'");
let script = format!(
"require('{addon_path_str}').{command}('{site_dir_str}', '{config_path_str}', '{escaped_opts}');"
);
let status = Command::new(node).args(["-e", &script]).status()?;
if !status.success() {
return Err(DocusaurusError::CommandFailed(status.code().unwrap_or(-1)));
}
Ok(())
}