use car_multi::{AgentRunner, SharedInfra};
use car_workflow::{Workflow, WorkflowEngine};
use std::sync::Arc;
pub async fn run_workflow(
workflow_json: &str,
runner: Arc<dyn AgentRunner>,
) -> Result<String, String> {
let workflow: Workflow = serde_json::from_str(workflow_json)
.map_err(|e| format!("invalid workflow JSON: {}", e))?;
let infra = SharedInfra::new();
let engine = WorkflowEngine::new(runner, infra);
let result = engine
.run(&workflow)
.await
.map_err(|e| format!("workflow error: {}", e))?;
serde_json::to_string(&result).map_err(|e| e.to_string())
}
pub fn verify_workflow(workflow_json: &str) -> Result<String, String> {
let workflow: Workflow = serde_json::from_str(workflow_json)
.map_err(|e| format!("invalid workflow JSON: {}", e))?;
let report = car_workflow::verify_workflow(&workflow);
let json = serde_json::json!({
"valid": report.valid,
"has_cycles": report.has_cycles,
"reachable_stages": report.reachable_stages,
"unreachable_stages": report.unreachable_stages,
"issues": report.issues.iter().map(|i| format!("{:?}", i)).collect::<Vec<_>>(),
});
Ok(json.to_string())
}