diff --git a/Cargo.lock b/Cargo.lock index 5a834101..5edc83ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,6 +47,7 @@ dependencies = [ "maplit", "serde", "serde_json", + "stepper-interface", ] [[package]] @@ -248,21 +249,11 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "475bd7aa7680b4ed8f6bb59745e882bcbaeb39326532bb79ffb1716480d9a274" -[[package]] -name = "console_error_panic_hook" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" -dependencies = [ - "cfg-if 0.1.10", - "wasm-bindgen", -] - [[package]] name = "const_fn" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab" +checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "constant_time_eq" @@ -744,7 +735,7 @@ dependencies = [ [[package]] name = "fluence" version = "0.2.11" -source = "git+https://github.com/fluencelabs/rust-sdk#3aab224c9778f6eb8f9750779982f33976bee630" +source = "git+https://github.com/fluencelabs/rust-sdk#8a2570bbc630b2a519aee146ac6c5a52d5afe6cd" dependencies = [ "fluence-sdk-macro 0.2.11 (git+https://github.com/fluencelabs/rust-sdk)", "fluence-sdk-main 0.2.11 (git+https://github.com/fluencelabs/rust-sdk)", @@ -800,7 +791,7 @@ dependencies = [ [[package]] name = "fluence-sdk-macro" version = "0.2.11" -source = "git+https://github.com/fluencelabs/rust-sdk#3aab224c9778f6eb8f9750779982f33976bee630" +source = "git+https://github.com/fluencelabs/rust-sdk#8a2570bbc630b2a519aee146ac6c5a52d5afe6cd" dependencies = [ "fluence-sdk-wit 0.2.11 (git+https://github.com/fluencelabs/rust-sdk)", ] @@ -819,7 +810,7 @@ dependencies = [ [[package]] name = "fluence-sdk-main" version = "0.2.11" -source = "git+https://github.com/fluencelabs/rust-sdk#3aab224c9778f6eb8f9750779982f33976bee630" +source = "git+https://github.com/fluencelabs/rust-sdk#8a2570bbc630b2a519aee146ac6c5a52d5afe6cd" dependencies = [ "fluence-sdk-macro 0.2.11 (git+https://github.com/fluencelabs/rust-sdk)", "log", @@ -843,7 +834,7 @@ dependencies = [ [[package]] name = "fluence-sdk-wit" version = "0.2.11" -source = "git+https://github.com/fluencelabs/rust-sdk#3aab224c9778f6eb8f9750779982f33976bee630" +source = "git+https://github.com/fluencelabs/rust-sdk#8a2570bbc630b2a519aee146ac6c5a52d5afe6cd" dependencies = [ "proc-macro2", "quote", @@ -1092,9 +1083,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "http" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" +checksum = "84129d298a6d57d246960ff8eb831ca4af3f96d29e2e28848dae275408658e26" dependencies = [ "bytes", "fnv", @@ -1194,9 +1185,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" dependencies = [ "autocfg", "hashbrown", @@ -1213,9 +1204,9 @@ dependencies = [ [[package]] name = "inventory" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedd49de24d8c263613701406611410687148ae8c37cd6452650b250f753a0dd" +checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f" dependencies = [ "ctor", "ghost", @@ -1224,9 +1215,9 @@ dependencies = [ [[package]] name = "inventory-impl" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddead8880bc50f57fcd3b5869a7f6ff92570bb4e8f6870c22e2483272f2256da" +checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51" dependencies = [ "proc-macro2", "quote", @@ -1484,9 +1475,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.36" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cf75f38f16cb05ea017784dc6dbfd354f76c223dba37701734c4f5a9337d02" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" dependencies = [ "cfg-if 0.1.10", "libc", @@ -1585,12 +1576,12 @@ checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" [[package]] name = "openssl" -version = "0.10.30" +version = "0.10.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d575eff3665419f9b83678ff2815858ad9d11567e082f5ac1814baba4e2bcb4" +checksum = "8d008f51b1acffa0d3450a68606e6a51c123012edaacb0f4e1426bd978869187" dependencies = [ "bitflags", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "foreign-types", "lazy_static", "libc", @@ -1605,9 +1596,9 @@ checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-sys" -version = "0.9.58" +version = "0.9.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" +checksum = "de52d8eabd217311538a39bba130d7dea1f1e118010fee7a033d966845e7d5fe" dependencies = [ "autocfg", "cc", @@ -1927,9 +1918,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.10.9" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb15d6255c792356a0f578d8a645c677904dc02e862bebe2ecc18e0c01b9a0ce" +checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" dependencies = [ "base64", "bytes", @@ -1956,7 +1947,6 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-bindgen-test", "web-sys", "winreg", ] @@ -2046,12 +2036,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scopeguard" version = "1.1.0" @@ -2203,13 +2187,12 @@ checksum = "ae524f056d7d770e174287294f562e95044c68e88dec909a00d2094805db9d75" [[package]] name = "socket2" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c29947abdee2a218277abeca306f25789c938e500ea5a9d4b12a5a504466902" +checksum = "97e0e9fd577458a4f61fb91fcb559ea2afecc54c934119421f9f5d3d5b1a1057" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall", "winapi 0.3.9", ] @@ -2219,6 +2202,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stepper-interface" +version = "0.1.0" +source = "git+https://github.com/fluencelabs/aquamarine?branch=new_stepper_outcome#7b70f015be7297f1d53336d64d2119148b1d44cc" +dependencies = [ + "fluence 0.2.11 (git+https://github.com/fluencelabs/rust-sdk)", + "serde", + "wasmer-interface-types-fl", +] + [[package]] name = "strsim" version = "0.8.0" @@ -2233,9 +2226,9 @@ checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "subtle" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" +checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" @@ -2382,9 +2375,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d7ad61edd59bfcc7e80dababf0f4aed2e6d5e0ba1659356ae889752dfc12ff" +checksum = "099837d3464c16a808060bb3f02263b412f6fafcb5d01c533d309985fbeebe48" dependencies = [ "bytes", "fnv", @@ -2609,9 +2602,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" +checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" [[package]] name = "vec_map" @@ -2756,30 +2749,6 @@ version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" -[[package]] -name = "wasm-bindgen-test" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0355fa0c1f9b792a09b6dcb6a8be24d51e71e6d74972f9eb4a44c4c004d24a25" -dependencies = [ - "console_error_panic_hook", - "js-sys", - "scoped-tls", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e07b46b98024c2ba2f9e83a10c2ef0515f057f2da299c1762a2017de80438b" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "wasm-greeting" version = "0.1.0" diff --git a/aquamarine-vm/Cargo.toml b/aquamarine-vm/Cargo.toml index 791b5737..422f1ae9 100644 --- a/aquamarine-vm/Cargo.toml +++ b/aquamarine-vm/Cargo.toml @@ -12,6 +12,7 @@ path = "src/lib.rs" [dependencies] fluence-faas = { path = "../fluence-faas", version = "0.1.11" } +stepper-interface = { git = "https://github.com/fluencelabs/aquamarine", branch = "new_stepper_outcome" } maplit = "1.0.2" serde_json = "1.0.57" diff --git a/aquamarine-vm/src/aquamarine_stepper_vm.rs b/aquamarine-vm/src/aquamarine_stepper_vm.rs index bb1c2bb8..bdc3a7a4 100644 --- a/aquamarine-vm/src/aquamarine_stepper_vm.rs +++ b/aquamarine-vm/src/aquamarine_stepper_vm.rs @@ -17,15 +17,13 @@ use crate::Result; use crate::AquamarineVMError; use crate::config::AquamarineVMConfig; -use crate::stepper_outcome::StepperOutcome; -use crate::stepper_outcome::RawStepperOutcome; use fluence_faas::FaaSConfig; use fluence_faas::FluenceFaaS; use fluence_faas::HostImportDescriptor; use fluence_faas::IValue; +use stepper_interface::StepperOutcome; -use std::convert::TryInto; use std::path::PathBuf; use std::path::Path; use crate::errors::AquamarineVMError::InvalidAquamarinePath; @@ -80,7 +78,7 @@ impl AquamarineVM { let prev_data_path = self.particle_data_store.join(particle_id); // TODO: check for errors related to invalid file content (such as invalid UTF8 string) - let prev_data = std::fs::read_to_string(&prev_data_path).unwrap_or(String::from("[]")); + let prev_data = std::fs::read_to_string(&prev_data_path).unwrap_or_default(); let args = vec![ IValue::String(init_user_id.into()), IValue::String(aqua.into()), @@ -92,11 +90,14 @@ impl AquamarineVM { self.faas .call_with_ivalues(&self.wasm_filename, "invoke", &args, <_>::default())?; - let raw_outcome = make_raw_outcome(result)?; - std::fs::write(&prev_data_path, &raw_outcome.data) + let outcome = StepperOutcome::from_ivalues(result) + .map_err(AquamarineVMError::StepperResultDeError)?; + + // persist resulted data + std::fs::write(&prev_data_path, &outcome.data) .map_err(|e| PersistDataError(e, prev_data_path))?; - raw_outcome.try_into() + Ok(outcome) } } @@ -138,25 +139,20 @@ fn make_faas_config( current_peer_id: String, logging_mask: i64, ) -> FaaSConfig { + use fluence_faas::FaaSModuleConfig; use maplit::hashmap; - let make_faas_module_config = |call_service: HostImportDescriptor| { - use fluence_faas::FaaSModuleConfig; - - let host_imports = hashmap! { - String::from(CALL_SERVICE_NAME) => call_service - }; - - FaaSModuleConfig { - mem_pages_count: None, - logger_enabled: true, - host_imports, - wasi: None, - logging_mask, - } + let host_imports = hashmap! { + String::from(CALL_SERVICE_NAME) => call_service }; - let mut aquamarine_module_config = make_faas_module_config(call_service); + let mut aquamarine_module_config = FaaSModuleConfig { + mem_pages_count: None, + logger_enabled: true, + host_imports, + wasi: None, + logging_mask, + }; let envs = hashmap! { CURRENT_PEER_ID_ENV_NAME.as_bytes().to_vec() => current_peer_id.into_bytes(), @@ -170,75 +166,6 @@ fn make_faas_config( } } -fn make_raw_outcome(mut result: Vec) -> Result { - use AquamarineVMError::AquamarineResultError as ResultError; - - match result.remove(0) { - IValue::Record(record_values) => { - let mut record_values = record_values.into_vec(); - if record_values.len() != 3 { - return Err(ResultError(format!( - "expected StepperOutcome struct with 3 fields, got {:?}", - record_values - ))); - } - - let ret_code = match record_values.remove(0) { - IValue::S32(ret_code) => ret_code, - v => { - return Err(ResultError(format!( - "expected i32 for ret_code, got {:?}", - v - ))) - } - }; - - let data = match record_values.remove(0) { - IValue::String(str) => str, - v => { - return Err(ResultError(format!( - "expected string for data, got {:?}", - v - ))) - } - }; - - let next_peer_pks = match record_values.remove(0) { - IValue::Array(ar_values) => { - let array = ar_values - .into_iter() - .map(|v| match v { - IValue::String(str) => Ok(str), - v => Err(ResultError(format!( - "expected string for next_peer_pks, got {:?}", - v - ))), - }) - .collect::>>()?; - - Ok(array) - } - v => Err(ResultError(format!( - "expected array for next_peer_pks, got {:?}", - v - ))), - }?; - - Ok(RawStepperOutcome { - ret_code, - data, - next_peer_pks, - }) - } - v => { - return Err(ResultError(format!( - "expected record for StepperOutcome, got {:?}", - v - ))) - } - } -} - // This API is intended for testing purposes #[cfg(feature = "raw-aquamarine-vm-api")] impl AquamarineVM { @@ -260,7 +187,9 @@ impl AquamarineVM { self.faas .call_with_ivalues(&self.wasm_filename, "invoke", &args, <_>::default())?; - let raw_outcome = make_raw_outcome(result)?; - raw_outcome.try_into() + let outcome = StepperOutcome::from_ivalues(result) + .map_err(AquamarineVMError::StepperResultDeError)?; + + Ok(outcome) } } diff --git a/aquamarine-vm/src/errors.rs b/aquamarine-vm/src/errors.rs index ce904997..f4d2995f 100644 --- a/aquamarine-vm/src/errors.rs +++ b/aquamarine-vm/src/errors.rs @@ -14,7 +14,6 @@ * limitations under the License. */ -use crate::stepper_outcome::StepperError; use fluence_faas::FaaSError; use std::io::Error as IOError; @@ -26,11 +25,8 @@ pub enum AquamarineVMError { /// FaaS errors. FaaSError(FaaSError), - /// Aquamarine result deserialization errors. - AquamarineResultError(String), - - /// Errors related to stepper execution. - StepperError(StepperError), + /// Aquamarine stepper result deserialization errors. + StepperResultDeError(String), /// I/O errors while persisting resulted data. PersistDataError(IOError, PathBuf), @@ -52,8 +48,7 @@ impl std::fmt::Display for AquamarineVMError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { match self { AquamarineVMError::FaaSError(err) => write!(f, "{}", err), - AquamarineVMError::AquamarineResultError(err_msg) => write!(f, "{}", err_msg), - AquamarineVMError::StepperError(err) => write!(f, "{}", err), + AquamarineVMError::StepperResultDeError(err_msg) => write!(f, "{}", err_msg), AquamarineVMError::PersistDataError(err, path) => write!( f, "an error occurred while saving prev data {:?} by {:?} path", @@ -69,13 +64,11 @@ impl std::fmt::Display for AquamarineVMError { invalid_path, io_error, reason, - } => { - write!( - f, - "path to AIR interpreter .wasm ({:?}) is invalid: {}; IO Error: {:?}", - invalid_path, reason, io_error - ) - } + } => write!( + f, + "path to AIR interpreter .wasm ({:?}) is invalid: {}; IO Error: {:?}", + invalid_path, reason, io_error + ), } } } @@ -86,12 +79,6 @@ impl From for AquamarineVMError { } } -impl From for AquamarineVMError { - fn from(err: StepperError) -> Self { - AquamarineVMError::StepperError(err) - } -} - impl From for AquamarineVMError { fn from(_: std::convert::Infallible) -> Self { unreachable!() diff --git a/aquamarine-vm/src/lib.rs b/aquamarine-vm/src/lib.rs index 4421973f..ca946007 100644 --- a/aquamarine-vm/src/lib.rs +++ b/aquamarine-vm/src/lib.rs @@ -27,13 +27,10 @@ mod aquamarine_stepper_vm; mod config; mod errors; -mod stepper_outcome; pub use aquamarine_stepper_vm::AquamarineVM; pub use config::AquamarineVMConfig; pub use errors::AquamarineVMError; -pub use stepper_outcome::StepperOutcome; -pub use stepper_outcome::StepperError; // Re-exports pub use fluence_faas::HostExportedFunc; diff --git a/aquamarine-vm/src/stepper_outcome.rs b/aquamarine-vm/src/stepper_outcome.rs deleted file mode 100644 index 402cf30c..00000000 --- a/aquamarine-vm/src/stepper_outcome.rs +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// This file is an adapted copy of the StepperOutcome structure and stepper errors. -// Maybe it is better to depend on aquamarine when it become public. - -use crate::AquamarineVMError; - -use std::convert::TryFrom; -use std::error::Error; - -#[derive(Debug, Default, Clone, PartialEq, Eq)] -pub(crate) struct RawStepperOutcome { - pub ret_code: i32, - pub data: String, - pub next_peer_pks: Vec, -} - -#[derive(Debug, Default, Clone, PartialEq, Eq)] -pub struct StepperOutcome { - pub data: String, - pub next_peer_pks: Vec, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum StepperError { - /// Errors occurred while parsing aqua script in the form of S expressions. - SExprParseError(String), - - /// Errors occurred while parsing function arguments of an expression. - FuncArgsSerializationError(String), - - /// Errors occurred while parsing returned by call_service value. - CallServiceResultDeserializationError(String), - - /// Indicates that environment variable with name CURRENT_PEER_ID isn't set. - CurrentPeerIdEnvError(String), - - /// Semantic errors in instructions. - InstructionError(String), - - /// An error is occurred while calling local service via call_service. - LocalServiceError(String), - - /// Value for such name isn't presence in data. - VariableNotFound(String), - - /// Multiple values for such name found. - MultipleVariablesFound(String), - - /// Value with such path wasn't found in data with such error. - VariableNotInJsonPath(String), - - /// Provided JValue has incompatible with target type. - IncompatibleJValueType(String), - - /// Provided AValue has incompatible with target type. - IncompatibleAValueType(String), - - /// Multiple values found for such json path. - MultipleValuesInJsonPath(String), - - /// Fold state wasn't found for such iterator name. - FoldStateNotFound(String), - - /// Multiple fold states found for such iterator name. - MultipleFoldStates(String), - - /// Expected evidence state of different type. - InvalidEvidenceState(String), - - /// Errors occurred on call evidence deserialization. - CallEvidenceDeserializationError(String), - - /// Errors occurred on call evidence serialization. - CallEvidenceSerializationError(String), - - /// Errors occurred when previous and current evidence states are incompatible. - IncompatibleEvidenceStates(String), - - /// Errors occurred when previous and current call results are incompatible. - IncompatibleCallResults(String), - - /// Errors occurred when evidence path contains less elements then corresponding Par has. - EvidencePathTooSmall(String), - - /// Related to such ret_code that doesn't have match with current StepperError. - UnknownError(String), -} - -impl Error for StepperError {} - -impl std::fmt::Display for StepperError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - match self { - StepperError::SExprParseError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::FuncArgsSerializationError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::CallServiceResultDeserializationError(err_msg) => { - writeln!(f, "{}", err_msg) - } - StepperError::CurrentPeerIdEnvError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::InstructionError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::LocalServiceError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::VariableNotFound(err_msg) => writeln!(f, "{}", err_msg), - StepperError::MultipleVariablesFound(err_msg) => writeln!(f, "{}", err_msg), - StepperError::VariableNotInJsonPath(err_msg) => writeln!(f, "{}", err_msg), - StepperError::IncompatibleJValueType(err_msg) => writeln!(f, "{}", err_msg), - StepperError::IncompatibleAValueType(err_msg) => writeln!(f, "{}", err_msg), - StepperError::MultipleValuesInJsonPath(err_msg) => writeln!(f, "{}", err_msg), - StepperError::FoldStateNotFound(err_msg) => writeln!(f, "{}", err_msg), - StepperError::MultipleFoldStates(err_msg) => writeln!(f, "{}", err_msg), - StepperError::InvalidEvidenceState(err_msg) => writeln!(f, "{}", err_msg), - StepperError::CallEvidenceDeserializationError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::CallEvidenceSerializationError(err_msg) => writeln!(f, "{}", err_msg), - StepperError::IncompatibleEvidenceStates(err_msg) => writeln!(f, "{}", err_msg), - StepperError::IncompatibleCallResults(err_msg) => writeln!(f, "{}", err_msg), - StepperError::EvidencePathTooSmall(err_msg) => writeln!(f, "{}", err_msg), - StepperError::UnknownError(err_msg) => writeln!(f, "{}", err_msg), - } - } -} - -impl TryFrom for StepperOutcome { - type Error = AquamarineVMError; - - fn try_from(raw_outcome: RawStepperOutcome) -> Result { - macro_rules! to_vm_error { - ($error_variant:ident) => { - Err(AquamarineVMError::StepperError( - StepperError::$error_variant(raw_outcome.data), - )) - }; - } - - match raw_outcome.ret_code { - 0 => Ok(StepperOutcome { - data: raw_outcome.data, - next_peer_pks: raw_outcome.next_peer_pks, - }), - 1 => to_vm_error!(SExprParseError), - 2 => to_vm_error!(FuncArgsSerializationError), - 3 => to_vm_error!(CallServiceResultDeserializationError), - 4 => to_vm_error!(CurrentPeerIdEnvError), - 5 => to_vm_error!(InstructionError), - 6 => to_vm_error!(LocalServiceError), - 7 => to_vm_error!(VariableNotFound), - 8 => to_vm_error!(MultipleVariablesFound), - 9 => to_vm_error!(VariableNotInJsonPath), - 10 => to_vm_error!(IncompatibleJValueType), - 11 => to_vm_error!(IncompatibleAValueType), - 12 => to_vm_error!(MultipleValuesInJsonPath), - 13 => to_vm_error!(FoldStateNotFound), - 14 => to_vm_error!(MultipleFoldStates), - 15 => to_vm_error!(InvalidEvidenceState), - 16 => to_vm_error!(CallEvidenceDeserializationError), - 17 => to_vm_error!(CallEvidenceSerializationError), - 18 => to_vm_error!(IncompatibleEvidenceStates), - 19 => to_vm_error!(IncompatibleCallResults), - 20 => to_vm_error!(EvidencePathTooSmall), - _ => to_vm_error!(UnknownError), - } - } -}