diff options
Diffstat (limited to 'core/ops_json.rs')
-rw-r--r-- | core/ops_json.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/core/ops_json.rs b/core/ops_json.rs index 07208a420..25752322a 100644 --- a/core/ops_json.rs +++ b/core/ops_json.rs @@ -51,6 +51,9 @@ where /// Creates an op that passes data asynchronously using JSON. /// +/// When this op is dispatched, the runtime doesn't exit while processing it. +/// Use op_async_unref instead if you want to make the runtime exit while processing it. +/// /// The provided function `op_fn` has the following parameters: /// * `Rc<RefCell<OpState>`: the op state, can be used to read/write resources in the runtime from an op. /// * `V`: the deserializable value that is passed to the Rust function. @@ -99,6 +102,37 @@ where }) } +/// Creates an op that passes data asynchronously using JSON. +/// +/// When this op is dispatched, the runtime still can exit while processing it. +/// +/// The other usages are the same as `op_async`. +pub fn op_async_unref<F, A, B, R, RV>(op_fn: F) -> Box<OpFn> +where + F: Fn(Rc<RefCell<OpState>>, A, B) -> R + 'static, + A: DeserializeOwned, + B: DeserializeOwned, + R: Future<Output = Result<RV, AnyError>> + 'static, + RV: Serialize + 'static, +{ + Box::new(move |state, payload| -> Op { + let pid = payload.promise_id; + // Deserialize args, sync error on failure + let args = match payload.deserialize() { + Ok(args) => args, + Err(err) => { + return Op::Sync(serialize_op_result(Err::<(), AnyError>(err), state)) + } + }; + let (a, b) = args; + + use crate::futures::FutureExt; + let fut = op_fn(state.clone(), a, b) + .map(move |result| (pid, serialize_op_result(result, state))); + Op::AsyncUnref(Box::pin(fut)) + }) +} + #[cfg(test)] mod tests { use super::*; |