use deno_core::OpState; use deno_core::op2; use crate::state::WfeState; /// Start a new workflow instance. Returns the workflow instance ID. #[op2] #[string] pub async fn op_start_workflow( state: std::rc::Rc>, #[string] definition_id: String, #[smi] version: u32, #[serde] data: serde_json::Value, ) -> Result { let host = { let s = state.borrow(); let wfe = s.borrow::(); wfe.host()?.clone() }; host.start_workflow(&definition_id, version, data) .await .map_err(|e| deno_error::JsErrorBox::generic(format!("start_workflow failed: {e}"))) } /// Suspend a running workflow. Returns true if suspension succeeded. #[op2] pub async fn op_suspend_workflow( state: std::rc::Rc>, #[string] id: String, ) -> Result { let host = { let s = state.borrow(); let wfe = s.borrow::(); wfe.host()?.clone() }; host.suspend_workflow(&id) .await .map_err(|e| deno_error::JsErrorBox::generic(format!("suspend_workflow failed: {e}"))) } /// Resume a suspended workflow. Returns true if resumption succeeded. #[op2] pub async fn op_resume_workflow( state: std::rc::Rc>, #[string] id: String, ) -> Result { let host = { let s = state.borrow(); let wfe = s.borrow::(); wfe.host()?.clone() }; host.resume_workflow(&id) .await .map_err(|e| deno_error::JsErrorBox::generic(format!("resume_workflow failed: {e}"))) } /// Terminate a workflow. Returns true if termination succeeded. #[op2] pub async fn op_terminate_workflow( state: std::rc::Rc>, #[string] id: String, ) -> Result { let host = { let s = state.borrow(); let wfe = s.borrow::(); wfe.host()?.clone() }; host.terminate_workflow(&id) .await .map_err(|e| deno_error::JsErrorBox::generic(format!("terminate_workflow failed: {e}"))) } /// Get a workflow instance by ID. Returns the serialized WorkflowInstance. #[op2] #[serde] pub async fn op_get_workflow( state: std::rc::Rc>, #[string] id: String, ) -> Result { let host = { let s = state.borrow(); let wfe = s.borrow::(); wfe.host()?.clone() }; let instance = host .get_workflow(&id) .await .map_err(|e| deno_error::JsErrorBox::generic(format!("get_workflow failed: {e}")))?; serde_json::to_value(&instance) .map_err(|e| deno_error::JsErrorBox::generic(format!("serialization failed: {e}"))) }