use std::path::Path;
use evorule_tcb::JsonValue;
use crate::error::CliError;
use crate::{executor, fact_log, io_util};
pub fn run(
rules_dir: &Path,
payload: Option<&str>,
payload_file: Option<&Path>,
output: Option<&Path>,
max_steps: usize,
) -> Result<(), CliError> {
let transforms = io_util::load_rules(rules_dir)?;
let initial_payload = io_util::parse_initial_payload(payload, payload_file)?;
let initial_instruction = JsonValue::object_from_pairs(&[("type", JsonValue::string("noop"))]);
tracing::info!(rules = transforms.len(), max_steps, "starting execution");
let (facts, _final_payload) =
executor::execute(&transforms, initial_payload, initial_instruction, max_steps)?;
fact_log::write_facts(output, &facts)?;
let has_error = facts
.iter()
.any(|f| matches!(f, evorule_reactor::Fact::Error { .. }));
if has_error {
tracing::warn!(facts = facts.len(), "execution completed with Error facts");
} else {
tracing::info!(facts = facts.len(), "execution completed successfully");
}
Ok(())
}