summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/ops_json.rs35
1 files changed, 11 insertions, 24 deletions
diff --git a/core/ops_json.rs b/core/ops_json.rs
index cf2e6230b..d368453d9 100644
--- a/core/ops_json.rs
+++ b/core/ops_json.rs
@@ -4,7 +4,6 @@ use crate::error::AnyError;
use crate::serialize_op_result;
use crate::Op;
use crate::OpFn;
-use crate::OpPayload;
use crate::OpState;
use crate::ZeroCopyBuf;
use serde::de::DeserializeOwned;
@@ -81,33 +80,21 @@ where
R: Future<Output = Result<RV, AnyError>> + 'static,
RV: Serialize + 'static,
{
- let try_dispatch_op = move |state: Rc<RefCell<OpState>>,
- p: OpPayload,
- buf: Option<ZeroCopyBuf>|
- -> Result<Op, AnyError> {
- let pid = p.promise_id;
- // Parse args
- let args = p.deserialize()?;
+ Box::new(move |state, payload, buf| -> 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))
+ }
+ };
use crate::futures::FutureExt;
let fut = op_fn(state.clone(), args, buf)
.map(move |result| (pid, serialize_op_result(result, state)));
- Ok(Op::Async(Box::pin(fut)))
- };
-
- Box::new(
- move |state: Rc<RefCell<OpState>>,
- p: OpPayload,
- b: Option<ZeroCopyBuf>|
- -> Op {
- match try_dispatch_op(state.clone(), p, b) {
- Ok(op) => op,
- Err(err) => {
- Op::Sync(serialize_op_result(Err::<(), AnyError>(err), state))
- }
- }
- },
- )
+ Op::Async(Box::pin(fut))
+ })
}
#[cfg(test)]