From 6e754f023f6055c8bf2701eecb2b99efca6a29f1 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 8 Oct 2020 12:43:23 +0300 Subject: [PATCH] Introduce Seq, Par, Fold instructions (#5) --- .circleci/config.yml | 43 + .gitignore | 3 + Cargo.lock | 1140 ++++++++++++++++- Cargo.toml | 43 +- Config.toml | 2 +- README.md | 29 +- artifacts/aquamarine.wasm | Bin 87130 -> 520314 bytes crates/test-module/Cargo.toml | 12 + crates/test-module/src/main.rs | 49 + crates/test-utils/Cargo.toml | 14 + crates/test-utils/src/lib.rs | 99 ++ src/air.rs | 170 --- src/errors.rs | 120 -- src/instructions/call.rs | 144 --- src/instructions/mod.rs | 49 - src/stepper/execution.rs | 51 - src/stepper/mod.rs | 25 - src/stepper/stepper.rs | 33 - stepper/Cargo.toml | 34 + stepper/src/air/call.rs | 274 ++++ stepper/src/air/fold.rs | 272 ++++ stepper/src/air/mod.rs | 82 ++ {src/instructions => stepper/src/air}/null.rs | 6 +- stepper/src/air/par.rs | 73 ++ stepper/src/air/seq.rs | 74 ++ {src => stepper/src}/defines.rs | 21 +- stepper/src/errors.rs | 182 +++ stepper/src/execution.rs | 120 ++ {src => stepper/src}/fce.rs | 19 +- .../src}/stepper_outcome.rs | 4 +- {src => stepper/src}/wasm_bindgen.rs | 6 +- stepper/tests/basic.rs | 162 +++ test_module/main.rs | 22 - 33 files changed, 2681 insertions(+), 696 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 crates/test-module/Cargo.toml create mode 100644 crates/test-module/src/main.rs create mode 100644 crates/test-utils/Cargo.toml create mode 100644 crates/test-utils/src/lib.rs delete mode 100644 src/air.rs delete mode 100644 src/errors.rs delete mode 100644 src/instructions/call.rs delete mode 100644 src/instructions/mod.rs delete mode 100644 src/stepper/execution.rs delete mode 100644 src/stepper/mod.rs delete mode 100644 src/stepper/stepper.rs create mode 100644 stepper/Cargo.toml create mode 100644 stepper/src/air/call.rs create mode 100644 stepper/src/air/fold.rs create mode 100644 stepper/src/air/mod.rs rename {src/instructions => stepper/src/air}/null.rs (80%) create mode 100644 stepper/src/air/par.rs create mode 100644 stepper/src/air/seq.rs rename {src => stepper/src}/defines.rs (75%) create mode 100644 stepper/src/errors.rs create mode 100644 stepper/src/execution.rs rename {src => stepper/src}/fce.rs (78%) rename {src/stepper => stepper/src}/stepper_outcome.rs (93%) rename {src => stepper/src}/wasm_bindgen.rs (95%) create mode 100644 stepper/tests/basic.rs delete mode 100644 test_module/main.rs diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..edcf814c --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,43 @@ +version: 2 +jobs: + aqua: + docker: + - image: circleci/rust:latest + resource_class: medium+ + environment: + RUST_BACKTRACE: 1 + RUST_TEST_THREADS: 1 + steps: + - checkout + - restore_cache: + keys: + - aqua01-{{ checksum "Cargo.lock" }} + - run: | + rustup toolchain install nightly-2020-07-12-x86_64-unknown-linux-gnu + rustup default nightly-2020-07-12-x86_64-unknown-linux-gnu + + rustup target add wasm32-wasi + rustup component add rustfmt + rustup component add clippy + + cargo install fcli + cd stepper + fce build + + cd .. + cargo fmt --all -- --check --color always + cargo build --release --all-features + cargo test --release --all-features + cargo clippy -v + + - save_cache: + paths: + - ~/.cargo + - ~/.rustup + key: aqua01-{{ checksum "Cargo.lock" }} + +workflows: + version: 2 + arqada: + jobs: + - aqua diff --git a/.gitignore b/.gitignore index ba07b712..13445573 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ /target .DS_Store .repl_history +*.wasm + +!./artifacts/*.wasm diff --git a/Cargo.lock b/Cargo.lock index 88882086..a24912b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,10 +9,35 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1fd36ffbb1fb7c834eac128ea8d0e310c5aeb635548f9d58861e1308d46e71c" + +[[package]] +name = "aqua-test-module" +version = "0.1.0" +dependencies = [ + "fluence", +] + +[[package]] +name = "aqua-test-utils" +version = "0.1.0" +dependencies = [ + "aquamarine-vm", + "fluence", + "serde_json", +] + [[package]] name = "aquamarine" version = "0.1.0" dependencies = [ + "aqua-test-utils", + "aquamarine-vm", + "env_logger", "fluence", "jsonpath_lib", "log", @@ -23,12 +48,34 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "aquamarine-vm" +version = "0.1.0" +source = "git+https://github.com/fluencelabs/fce#1c2578ede462430d6d15e6c750a515600342f69d" +dependencies = [ + "fluence-faas", + "serde", + "serde_json", +] + [[package]] name = "array_tool" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f8cb5d814eb646a863c4f24978cff2880c4be96ad8cde2c0f0678732902e271" +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + [[package]] name = "atty" version = "0.2.14" @@ -46,18 +93,239 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "bincode" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake3" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + [[package]] name = "bumpalo" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cc" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" + [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "cmd_lib" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475bd7aa7680b4ed8f6bb59745e882bcbaeb39326532bb79ffb1716480d9a274" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cranelift-bforest" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a9c21f8042b9857bda93f6c1910b9f9f24100187a3d3d52f214a34e3dc5818" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7853f77a6e4a33c67a69c40f5e1bb982bd2dc5c4a22e17e67b65bbccf9b33b2e" +dependencies = [ + "byteorder", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli", + "log", + "smallvec", + "target-lexicon", + "thiserror", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084cd6d5fb0d1da28acd72c199471bfb09acc703ec8f3bf07b1699584272a3b9" +dependencies = [ + "cranelift-codegen-shared", + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "701b599783305a58c25027a4d73f2d6b599b2d8ef3f26677275f480b4d51e05d" + +[[package]] +name = "cranelift-entity" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88e792b28e1ebbc0187b72ba5ba880dad083abe9231a99d19604d10c9e73f38" + +[[package]] +name = "cranelift-native" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32daf082da21c0c05d93394ff4842c2ab7c4991b1f3186a1d952f8ac660edd0b" +dependencies = [ + "cranelift-codegen", + "raw-cpuid", + "target-lexicon", +] + +[[package]] +name = "crossbeam-channel" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" +dependencies = [ + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.4", + "subtle", +] + +[[package]] +name = "ctor" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.3", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + [[package]] name = "env_logger" version = "0.7.1" @@ -72,36 +340,148 @@ dependencies = [ ] [[package]] -name = "fluence" -version = "0.2.7" -source = "git+https://github.com/fluencelabs/rust-sdk#e5d564d4a61e203798383b01505ba23e54e71912" +name = "erased-serde" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ca8b296792113e1500fd935ae487be6e00ce318952a6880555554824d6ebf38" dependencies = [ - "fluence-sdk-macro", - "fluence-sdk-main", + "serde", +] + +[[package]] +name = "errno" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eab5ee3df98a279d9b316b1af6ac95422127b1290317e6d18c1743c99418b01" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" +dependencies = [ + "gcc", + "libc", +] + +[[package]] +name = "fce" +version = "0.1.7" +source = "git+https://github.com/fluencelabs/fce#1c2578ede462430d6d15e6c750a515600342f69d" +dependencies = [ + "boolinator", + "fce-wit-interfaces", + "fce-wit-parser", + "log", + "multi-map", + "multimap", + "parity-wasm", + "pwasm-utils", + "safe-transmute", + "wasmer-interface-types-fl", + "wasmer-runtime-core-fl", + "wasmer-runtime-fl", + "wasmer-wasi-fl", +] + +[[package]] +name = "fce-wit-interfaces" +version = "0.1.5" +source = "git+https://github.com/fluencelabs/fce#1c2578ede462430d6d15e6c750a515600342f69d" +dependencies = [ + "multimap", + "wasmer-interface-types-fl", +] + +[[package]] +name = "fce-wit-parser" +version = "0.1.7" +source = "git+https://github.com/fluencelabs/fce#1c2578ede462430d6d15e6c750a515600342f69d" +dependencies = [ + "anyhow", + "fce-wit-interfaces", + "walrus", + "wasmer-interface-types-fl", + "wasmer-runtime-core-fl", +] + +[[package]] +name = "fluence" +version = "0.2.8" +source = "git+https://github.com/fluencelabs/rust-sdk#4d6c4f6b862c22ebd8db7244daac0adf3f1bd2fd" +dependencies = [ + "fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)", + "fluence-sdk-main 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)", +] + +[[package]] +name = "fluence-faas" +version = "0.1.8" +source = "git+https://github.com/fluencelabs/fce#1c2578ede462430d6d15e6c750a515600342f69d" +dependencies = [ + "cmd_lib", + "fce", + "fluence-sdk-main 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools", + "log", + "safe-transmute", + "serde", + "serde_derive", + "serde_json", + "toml", + "wasmer-interface-types-fl", + "wasmer-runtime-core-fl", + "wasmer-runtime-fl", + "wasmer-wasi-fl", ] [[package]] name = "fluence-sdk-macro" -version = "0.2.7" -source = "git+https://github.com/fluencelabs/rust-sdk#e5d564d4a61e203798383b01505ba23e54e71912" +version = "0.2.8" +source = "git+https://github.com/fluencelabs/rust-sdk#4d6c4f6b862c22ebd8db7244daac0adf3f1bd2fd" dependencies = [ - "fluence-sdk-wit", + "fluence-sdk-wit 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)", +] + +[[package]] +name = "fluence-sdk-macro" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b1720124376ac6bb13e523e3eceeef4475041a03a6434ca7d988cbdc031a5c4" +dependencies = [ + "fluence-sdk-wit 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fluence-sdk-main" -version = "0.2.7" -source = "git+https://github.com/fluencelabs/rust-sdk#e5d564d4a61e203798383b01505ba23e54e71912" +version = "0.2.8" +source = "git+https://github.com/fluencelabs/rust-sdk#4d6c4f6b862c22ebd8db7244daac0adf3f1bd2fd" dependencies = [ - "fluence-sdk-macro", + "fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)", + "log", + "serde", +] + +[[package]] +name = "fluence-sdk-main" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5484ff6f5e091d4904217c45ed86cd0215e496090adaa9716e510742177fc512" +dependencies = [ + "fluence-sdk-macro 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "log", "serde", ] [[package]] name = "fluence-sdk-wit" -version = "0.2.7" -source = "git+https://github.com/fluencelabs/rust-sdk#e5d564d4a61e203798383b01505ba23e54e71912" +version = "0.2.8" +source = "git+https://github.com/fluencelabs/rust-sdk#4d6c4f6b862c22ebd8db7244daac0adf3f1bd2fd" dependencies = [ "proc-macro2", "quote", @@ -111,6 +491,55 @@ dependencies = [ "uuid", ] +[[package]] +name = "fluence-sdk-wit" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560baf91197ded38a99a5c94ff366a3dd971ebf33f5d987ecce31d3dedf86d17" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "uuid", +] + +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + +[[package]] +name = "generational-arena" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d3b771574f62d0548cee0ad9057857e9fc25d7a3335f140c84f6acd0bf601" +dependencies = [ + "cfg-if", + "serde", +] + +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check 0.9.2", +] + [[package]] name = "getrandom" version = "0.1.15" @@ -119,7 +548,28 @@ checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghost" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "gimli" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dd6190aad0f05ddbbf3245c54ed14ca4aa6dd32f22312b70d8f168c3e3e633" +dependencies = [ + "byteorder", + "indexmap", ] [[package]] @@ -129,14 +579,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" [[package]] -name = "hermit-abi" -version = "0.1.16" +name = "heck" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + [[package]] name = "humantime" version = "1.3.0" @@ -146,6 +611,12 @@ dependencies = [ "quick-error", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "indexmap" version = "1.6.0" @@ -154,6 +625,38 @@ checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" dependencies = [ "autocfg", "hashbrown", + "serde", +] + +[[package]] +name = "inventory" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedd49de24d8c263613701406611410687148ae8c37cd6452650b250f753a0dd" +dependencies = [ + "ctor", + "ghost", + "inventory-impl", +] + +[[package]] +name = "inventory-impl" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddead8880bc50f57fcd3b5869a7f6ff92570bb4e8f6870c22e2483272f2256da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", ] [[package]] @@ -182,10 +685,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] -name = "libc" -version = "0.2.77" +name = "leb128" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" +checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" + +[[package]] +name = "lexical-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616" +dependencies = [ + "arrayvec", + "bitflags", + "cfg-if", + "ryu", + "static_assertions", +] + +[[package]] +name = "libc" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743" + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] [[package]] name = "log" @@ -196,12 +727,65 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg", +] + +[[package]] +name = "multi-map" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bba551d6d795f74a01767577ea8339560bf0a65354e0417b7e915ed608443d46" + +[[package]] +name = "multimap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333" +dependencies = [ + "serde", +] + +[[package]] +name = "nix" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "void", +] + [[package]] name = "nom" version = "4.2.3" @@ -209,7 +793,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ "memchr", - "version_check", + "version_check 0.1.5", +] + +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "lexical-core", + "memchr", + "version_check 0.9.2", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "page_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parity-wasm" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" + +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "smallvec", + "winapi", ] [[package]] @@ -220,13 +865,24 @@ checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" [[package]] name = "proc-macro2" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ef7cd2518ead700af67bf9d1a658d90b6037d77110fd9c0445429d0ba1c6c9" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" dependencies = [ "unicode-xid", ] +[[package]] +name = "pwasm-utils" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" +dependencies = [ + "byteorder", + "log", + "parity-wasm", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -283,6 +939,48 @@ dependencies = [ "rand_core", ] +[[package]] +name = "raw-cpuid" +version = "7.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" +dependencies = [ + "bitflags", + "cc", + "rustc_version", +] + +[[package]] +name = "rayon" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf6960dc9a5b4ee8d3e4c5787b4a112a8818e0290a42ff664ad60692fdf2032" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c4fec834fb6e6d2dd5eece3c7b432a52f0ba887cf40e595190c4107edc08bf" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + [[package]] name = "regex" version = "1.3.9" @@ -301,12 +999,48 @@ version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + [[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +[[package]] +name = "safe-transmute" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b8b2cd387f744f69469aaed197954ba4c0ecdb31e02edf99b023e0df11178a" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "serde" version = "1.0.116" @@ -316,6 +1050,25 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-bench" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.116" @@ -329,9 +1082,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c" +checksum = "a230ea9107ca2220eea9d46de97eddcb04cd00e92d13dda78e478dd33fa82bd4" dependencies = [ "indexmap", "itoa", @@ -345,10 +1098,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5318bfeed779c64075ce317c81462ed54dc00021be1c6b34957d798e11a68bdb" dependencies = [ - "nom", + "nom 4.2.3", "serde", ] +[[package]] +name = "smallvec" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" + [[package]] name = "syn" version = "1.0.42" @@ -360,6 +1131,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "target-lexicon" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" + [[package]] name = "termcolor" version = "1.1.0" @@ -369,6 +1146,26 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "318234ffa22e0920fe9a40d7b8369b5f649d490980cf7aadcf1eb91594869b42" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae2447b6282786c3493999f40a9be2a6ad20cb8bd268b0a0dbf5a065535c0ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.0.1" @@ -378,6 +1175,62 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "toml" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "typetag" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b97b107d25d29de6879ac4f676ac5bfea92bdd01f206e995794493f1fc2e32" +dependencies = [ + "erased-serde", + "inventory", + "lazy_static", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2466fc87b07b800a5060f89ba579d6882f7a03ac21363e4737764aaf9f99f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-segmentation" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" + [[package]] name = "unicode-xid" version = "0.2.1" @@ -399,12 +1252,56 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walrus" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f970863270179a4e0ca2bfb470931f883f7535ae8b9dac4271761fa1b77e253d" +dependencies = [ + "anyhow", + "id-arena", + "leb128", + "log", + "walrus-macro", + "wasmparser 0.55.0", +] + +[[package]] +name = "walrus-macro" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80927fca8665132b48c7714bcec983d6e761c60b3a9877c6cd7df86417b13573" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-bindgen" version = "0.2.68" @@ -459,6 +1356,197 @@ version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" +[[package]] +name = "wasmer-clif-backend-fl" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532fb6cef712d9cd1ec68f9fc561447df33313393926f9bdb91fc3d67eed918f" +dependencies = [ + "byteorder", + "cranelift-codegen", + "cranelift-entity", + "cranelift-native", + "libc", + "nix", + "rayon", + "serde", + "serde-bench", + "serde_bytes", + "serde_derive", + "target-lexicon", + "wasmer-clif-fork-frontend", + "wasmer-clif-fork-wasm", + "wasmer-runtime-core-fl", + "wasmer-win-exception-handler", + "wasmparser 0.51.4", + "winapi", +] + +[[package]] +name = "wasmer-clif-fork-frontend" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c23f2824f354a00a77e4b040eef6e1d4c595a8a3e9013bad65199cc8dade9a5a" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "wasmer-clif-fork-wasm" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35e21d3aebc51cc6ebc0e830cf8458a9891c3482fb3c65ad18d408102929ae5" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "log", + "thiserror", + "wasmer-clif-fork-frontend", + "wasmparser 0.51.4", +] + +[[package]] +name = "wasmer-interface-types-fl" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475cafb8bf9763895f6fde0d7417b9090145fc461ad7aef21b1a866b8357c091" +dependencies = [ + "log", + "nom 5.1.2", + "safe-transmute", + "serde", + "serde_json", + "wast", +] + +[[package]] +name = "wasmer-runtime-core" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740161245998752cf1a567e860fd6355df0336fedca6be1940ec7aaa59643220" +dependencies = [ + "bincode", + "blake3", + "cc", + "digest 0.8.1", + "errno", + "hex", + "indexmap", + "lazy_static", + "libc", + "nix", + "page_size", + "parking_lot", + "rustc_version", + "serde", + "serde-bench", + "serde_bytes", + "serde_derive", + "smallvec", + "target-lexicon", + "wasmparser 0.51.4", + "winapi", +] + +[[package]] +name = "wasmer-runtime-core-fl" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4630ff544a2d7f76938bcf82ae217e0bd5c9ee078c653459d4f117c2045d315" +dependencies = [ + "bincode", + "blake3", + "cc", + "digest 0.8.1", + "errno", + "hex", + "indexmap", + "lazy_static", + "libc", + "nix", + "page_size", + "parking_lot", + "rustc_version", + "serde", + "serde-bench", + "serde_bytes", + "serde_derive", + "smallvec", + "target-lexicon", + "wasmparser 0.51.4", + "winapi", +] + +[[package]] +name = "wasmer-runtime-fl" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e855c8942f998a6938e43c1d0bb11b76a60b1c8341e08db36cc36b97b58bb1e9" +dependencies = [ + "lazy_static", + "memmap", + "serde", + "serde_derive", + "wasmer-clif-backend-fl", + "wasmer-runtime-core-fl", +] + +[[package]] +name = "wasmer-wasi-fl" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2493c1ef951a7a1704ecfd39abbbbb2346bf3768d761ef64ed53249a32b181" +dependencies = [ + "bincode", + "byteorder", + "generational-arena", + "getrandom", + "libc", + "log", + "serde", + "thiserror", + "time", + "typetag", + "wasmer-runtime-core-fl", + "winapi", +] + +[[package]] +name = "wasmer-win-exception-handler" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd39f3b2bd7964b28ea6f944a7eaa445cfbc91c4f2695d188103f2689bb37d9" +dependencies = [ + "cc", + "libc", + "wasmer-runtime-core", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.51.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" + +[[package]] +name = "wasmparser" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af931e2e1960c53f4a28b063fec4cacd036f35acbec8ff3a4739125b17382a87" + +[[package]] +name = "wast" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9df3d716118a503b2f6bbb6ff46b21997ab0cc167b01de7a188e45e4b01e8d" +dependencies = [ + "leb128", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 4054a328..d3bb1a6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,31 +1,14 @@ -[package] -name = "aquamarine" -version = "0.1.0" -authors = ["Fluence Labs"] -edition = "2018" +[workspace] +members = [ + "crates/test-module", + "crates/test-utils", + "stepper", +] -[lib] -name = "aquamarine_client" -crate-type = ["cdylib"] -path = "src/wasm_bindgen.rs" - -[[bin]] -name = "aquamarine" -path = "src/fce.rs" - -[[bin]] -name = "aqua_test_module" -path = "test_module/main.rs" - -[dependencies] -fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["logger"] } - -serde = { version = "1.0.116", features = ["derive"] } -serde_derive = "1.0.116" -serde_sexpr = "0.1.0" - -jsonpath_lib = "0.2.5" - -log = "0.4.11" -serde_json = "1.0" -wasm-bindgen = "0.2.68" +[profile.release] +opt-level = 3 +debug = false +lto = true +debug-assertions = false +overflow-checks = false +panic = "abort" diff --git a/Config.toml b/Config.toml index a2ff56f3..58f44d1b 100644 --- a/Config.toml +++ b/Config.toml @@ -11,4 +11,4 @@ name = "aquamarine" logger_enabled = true [module.wasi] - envs = ["CURRENT_PEER_ID=asd"] + envs = { "CURRENT_PEER_ID" = "some_peer_id" } diff --git a/README.md b/README.md index 90d58dc5..25806795 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,36 @@ Aquamarine is a distributed choreography language & platform +## AIR + +The current version supports the following instructions: +- call +- par +- seq +- fold +- next +- null + ## Examples ```lisp -((call (%current% (local_service_id local_fn_name) () result_name)) (call (remote_peer_id (service_id fn_name) () g))) +(seq ( + (call (%current_peer_id1% (local_service_id local_fn_name) () result_name_1)) + (call (remote_peer_id (service_id fn_name) () result_name_2)) +)), ``` -This instruction sequence contains two call instructions: + +This instruction sequence contains two call instructions in the sequential order: 1. call a function with `local_fn_name` name of a local service with `local_service_id` id and bind result to `result_name` 2. call a remote peer with `remote_peer_id` id + +```lisp +(fold (Iterable i + (seq ( + (call (%current_peer_id% (local_service_id local_fn_name) (i) acc[])) + (next i) + ) +))) +``` + +This example is an analog of left fold. It iterates over `Iterable` and on each iteration calls `local_service_id` and puts result to `acc`. diff --git a/artifacts/aquamarine.wasm b/artifacts/aquamarine.wasm index fe7ff77c6cbbeda3662b85d295c96a10a7e28778..e9522520550710bd9d4909d7344c1334fa12aebd 100644 GIT binary patch literal 520314 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 L`V6sfZ%rqLulAscbl3 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

UX+%zbNjm+~%PN_uX6VLXqg?b3=AV;j9 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 literal 87130 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 diff --git a/crates/test-module/Cargo.toml b/crates/test-module/Cargo.toml new file mode 100644 index 00000000..d8706af4 --- /dev/null +++ b/crates/test-module/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "aqua-test-module" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[[bin]] +name = "aqua_test_module" +path = "src/main.rs" + +[dependencies] +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["logger"] } diff --git a/crates/test-module/src/main.rs b/crates/test-module/src/main.rs new file mode 100644 index 00000000..68d58808 --- /dev/null +++ b/crates/test-module/src/main.rs @@ -0,0 +1,49 @@ +/* + * 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. + */ + +#![warn(rust_2018_idioms)] +#![deny( + dead_code, + nonstandard_style, + unused_imports, + unused_mut, + unused_variables, + unused_unsafe, + unreachable_patterns +)] + +use fluence::fce; + +fn main() {} + +#[fce] +pub struct CallServiceResult { + pub ret_code: i32, + pub result: String, +} + +#[fce] +pub fn call_service(service_id: String, fn_name: String, args: String) -> CallServiceResult { + println!( + "call service invoked with:\n service_id: {}\n fn_name: {}\n args: {:?}", + service_id, fn_name, args + ); + + CallServiceResult { + ret_code: 0, + result: String::from("[\"result string\"]"), + } +} diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml new file mode 100644 index 00000000..bea79586 --- /dev/null +++ b/crates/test-utils/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "aqua-test-utils" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[lib] +name = "aqua_test_utils" +path = "src/lib.rs" + +[dependencies] +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["logger"] } +aquamarine-vm = { git = "https://github.com/fluencelabs/fce" } +serde_json = "1.0.56" diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs new file mode 100644 index 00000000..702c0265 --- /dev/null +++ b/crates/test-utils/src/lib.rs @@ -0,0 +1,99 @@ +/* + * 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. + */ + +#![warn(rust_2018_idioms)] +#![deny( + dead_code, + nonstandard_style, + unused_imports, + unused_mut, + unused_variables, + unused_unsafe, + unreachable_patterns +)] + +use aquamarine_vm::vec1::Vec1; +use aquamarine_vm::AquamarineVM; +use aquamarine_vm::AquamarineVMConfig; +use aquamarine_vm::HostExportedFunc; +use aquamarine_vm::HostImportDescriptor; +use aquamarine_vm::IType; +use aquamarine_vm::IValue; + +use std::path::PathBuf; + +pub fn create_aqua_vm(call_service: HostExportedFunc) -> AquamarineVM { + let call_service_descriptor = HostImportDescriptor { + host_exported_func: call_service, + argument_types: vec![IType::String, IType::String, IType::String], + output_type: Some(IType::Record(0)), + error_handler: None, + }; + + let config = AquamarineVMConfig { + aquamarine_wasm_path: PathBuf::from("../target/wasm32-wasi/debug/aquamarine.wasm"), + call_service: call_service_descriptor, + current_peer_id: String::from("test_peer_id"), + }; + + AquamarineVM::new(config).expect("vm should be created") +} + +pub fn unit_call_service() -> HostExportedFunc { + Box::new(|_, _| -> Option { + Some(IValue::Record( + Vec1::new(vec![ + IValue::S32(0), + IValue::String(String::from("\"test\"")), + ]) + .unwrap(), + )) + }) +} + +pub fn echo_string_call_service() -> HostExportedFunc { + Box::new(|_, args| -> Option { + let arg = match &args[2] { + IValue::String(str) => str, + _ => unreachable!(), + }; + + let arg: Vec = serde_json::from_str(arg).unwrap(); + + Some(IValue::Record( + Vec1::new(vec![ + IValue::S32(0), + IValue::String(format!("\"{}\"", arg[0])), + ]) + .unwrap(), + )) + }) +} + +pub fn echo_number_call_service() -> HostExportedFunc { + Box::new(|_, args| -> Option { + let arg = match &args[2] { + IValue::String(str) => str, + _ => unreachable!(), + }; + + let arg: Vec = serde_json::from_str(arg).unwrap(); + + Some(IValue::Record( + Vec1::new(vec![IValue::S32(0), IValue::String(arg[0].clone())]).unwrap(), + )) + }) +} diff --git a/src/air.rs b/src/air.rs deleted file mode 100644 index 1975460d..00000000 --- a/src/air.rs +++ /dev/null @@ -1,170 +0,0 @@ -/* - - - -null -out: a!b . P -inp: a(b). P <- barrier -par: P | Q -new: nx . P <- restriction -rep: !P -sum: P + Q - -(seq --- arrow - (proc -> new x) - (proc that uses x) -) - -Scope: -a <- A -a -> B - -(seq - (par - x <- P - y <- Q - ) - (call fn [x y] z) -) - -(seq - (call fn1 [] x) - (call fn2 [x] y) -) - -(seq P Q) <- scope -(par P Q) <- independent -(xor P Q) <- lazy - --- fire and forget (any) -(seq - (par - x <- P - y <- Q - ) - (call fn [] z) -) - --- join -(seq - (par - x <- P - y <- Q - ) - (call noop [x y]) -) - --- any (fastest) -(seq - (par - x[] <- P - x[] <- Q - ) - (call fn [x.0]) -) - -data - HashMap -x.h.a.v -> (x - key in data, h.a.v - json path) - -0 -1 - -(call 1 (counter inc) [x.a] b) -(call 0 (response inc) [b] _) - --- any (fastest) -- does not work -(seq - (seq - (par - x <- P - y <- Q - ) - (xor - (call fn [x.h.a.v, x.a.b.n] z) - (call fn [y] z) - ) - ) - (call fn11 [z]) -) - -ITERATORS - -(seq - (fold Iterable i - (par - (call fn [i] acc[]) - (next i) - ) - ) - (match acc.length 3 - (call fnAgg [acc] y) - ) -) - - - - - (par - (call fn [i.0] acc[]) - (par - (call fn [i.1] acc[]) - (par - (call fn [i.2 acc[]) - (fold Iterable[3,..] i - (par - (call fn [i] acc[]) - (next i) - ) - ) - ) - ) - ) - - -(seq - (fold Iterable i - (seq - (call fn [i acc] acc[]) - (next i) - ) - ) - (call fnAgg [acc] y) -) - -(seq - (fold Iterable i - (xor - (call fn [i] res) - (next i) - ) - ) - (call fnAgg [res] y) -) - - */ - -/* - -Addressing: - -To address a code we need to declare: -(peer_pk, srv_id, fn_name) - -(call PEER_PART FN_PART [args] res_name) - -(current) -(pk $pk) -(pk $pk $srv_id) -PEER_PART: resolves to (peer_pk) \/ (peer_pk, pk_srv_id) - -(fn $name) -(fn $name $srv_id) -FN_PART: resolves to (fn_name) \/ (fn_srv_id, fn_name) - -Call resolves to: -(peer_pk, fn_srv_id || pk_srv_id, fn_name) -If !fn_srv_id && !pk_srv_id <- error - - -(call (current) (fn "resolve" "by_pk") [pk]) - */ diff --git a/src/errors.rs b/src/errors.rs deleted file mode 100644 index 4fedb9d1..00000000 --- a/src/errors.rs +++ /dev/null @@ -1,120 +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. - */ - -use crate::StepperOutcome; - -use jsonpath_lib::JsonPathError; -use serde_json::Error as SerdeJsonError; -use serde_sexpr::Error as SExprError; - -use std::convert::Into; -use std::env::VarError; -use std::error::Error; - -#[derive(Debug)] -pub enum AquamarineError { - /// Errors occurred while parsing aqua script in the form of S expressions. - SExprParseError(SExprError), - - /// Errors occurred while parsing supplied data. - DataParseError(SerdeJsonError), - - /// Indicates that environment variable with name CURRENT_PEER_ID isn't set. - CurrentPeerIdNotSet(VarError), - - /// Semantic errors in instructions. - InstructionError(String), - - /// Semantic errors in instructions. - LocalServiceError(String), - - /// Value with such name isn't presence in data. - VariableNotFound(String), - - /// Value with such path isn't found in data with such error. - VariableNotInJsonPath(String, JsonPathError), - - /// Multiple values found for such json path. - MultipleValuesInJsonPath(String), -} - -impl Error for AquamarineError {} - -impl std::fmt::Display for AquamarineError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - match self { - AquamarineError::SExprParseError(err) => write!(f, "{}", err), - AquamarineError::DataParseError(err) => write!(f, "{}", err), - AquamarineError::CurrentPeerIdNotSet(err) => write!(f, "{}", err), - AquamarineError::InstructionError(err_msg) => write!(f, "{}", err_msg), - AquamarineError::LocalServiceError(err_msg) => write!(f, "{}", err_msg), - AquamarineError::VariableNotFound(variable_name) => write!( - f, - "variable with name {} isn't present in data", - variable_name - ), - AquamarineError::VariableNotInJsonPath(json_path, json_path_err) => write!( - f, - "variable with path {} not found with error: {}", - json_path, json_path_err - ), - AquamarineError::MultipleValuesInJsonPath(json_path) => write!( - f, - "multiple variables found for this json path {}", - json_path - ), - } - } -} - -impl From for AquamarineError { - fn from(err: SExprError) -> Self { - AquamarineError::SExprParseError(err) - } -} - -impl From for AquamarineError { - fn from(err: SerdeJsonError) -> Self { - AquamarineError::DataParseError(err) - } -} - -impl From for AquamarineError { - fn from(_: std::convert::Infallible) -> Self { - unreachable!() - } -} - -impl Into for AquamarineError { - fn into(self) -> StepperOutcome { - let ret_code = match self { - AquamarineError::SExprParseError(_) => 1, - AquamarineError::DataParseError(..) => 2, - AquamarineError::CurrentPeerIdNotSet(..) => 3, - AquamarineError::InstructionError(..) => 4, - AquamarineError::LocalServiceError(..) => 5, - AquamarineError::VariableNotFound(..) => 6, - AquamarineError::VariableNotInJsonPath(..) => 7, - AquamarineError::MultipleValuesInJsonPath(..) => 8, - }; - - StepperOutcome { - ret_code, - data: format!("{}", self), - next_peer_pks: vec![], - } - } -} diff --git a/src/instructions/call.rs b/src/instructions/call.rs deleted file mode 100644 index 5aa46140..00000000 --- a/src/instructions/call.rs +++ /dev/null @@ -1,144 +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. - */ - -use crate::AquaData; -use crate::AquamarineError; -use crate::Result; - -use serde_derive::Deserialize; -use serde_derive::Serialize; - -const CURRENT_PEER_ALIAS: &str = "%current%"; -const CURRENT_PEER_ID_ENV_NAME: &str = "CURRENT_PEER_ID"; - -/* - (current) - (pk $pk) - (pk $pk $srv_id) - PEER_PART: resolves to (peer_pk) \/ (peer_pk, pk_srv_id) - - (fn $name) - (fn $name $srv_id) - FN_PART: resolves to (fn_name) \/ (fn_srv_id, fn_name) -*/ - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -pub enum PeerPart { - PeerPk(String), - PeerPkWithPkServiceId(String, String), -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -pub enum FunctionPart { - FuncName(String), - ServiceIdWithFuncName(String, String), -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -pub(crate) struct Call(PeerPart, FunctionPart, Vec, String); - -impl super::ExecutableInstruction for Call { - fn execute(self, data: &mut AquaData, next_peer_pks: &mut Vec) -> Result<()> { - log::info!("call called with data: {:?} and next_peer_pks: {:?}", data, next_peer_pks); - - let (peer_pk, service_id, func_name) = parse_peer_fn_parts(self.0, self.1)?; - let function_args = parse_args(self.2, data)?; - let function_args = serde_json::to_string(&function_args)?; - let result_name = parse_result_name(self.3)?; - - let current_peer_id = std::env::var(CURRENT_PEER_ID_ENV_NAME) - .map_err(|e| AquamarineError::CurrentPeerIdNotSet(e))?; - - if peer_pk == current_peer_id || peer_pk == CURRENT_PEER_ALIAS { - let result = unsafe { crate::call_service(service_id, func_name, function_args) }; - if result.ret_code != crate::CALL_SERVICE_SUCCESS { - return Err(AquamarineError::LocalServiceError(result.result)); - } - - let result: serde_json::Value = serde_json::from_str(&result.result)?; - data.insert(result_name, result); - } else { - next_peer_pks.push(peer_pk); - } - - Ok(()) - } -} - -#[rustfmt::skip] -fn parse_peer_fn_parts( - peer_part: PeerPart, - fn_part: FunctionPart, -) -> Result<(String, String, String)> { - match (peer_part, fn_part) { - (PeerPart::PeerPkWithPkServiceId(peer_pk, peer_service_id), FunctionPart::ServiceIdWithFuncName(_service_id, func_name)) => { - Ok((peer_pk, peer_service_id, func_name)) - }, - (PeerPart::PeerPkWithPkServiceId(peer_pk, peer_service_id), FunctionPart::FuncName(func_name)) => { - Ok((peer_pk, peer_service_id, func_name)) - }, - (PeerPart::PeerPk(peer_pk), FunctionPart::ServiceIdWithFuncName(service_id, func_name)) => { - Ok((peer_pk, service_id, func_name)) - } - (PeerPart::PeerPk(_), FunctionPart::FuncName(_)) => Err(AquamarineError::InstructionError( - String::from("call should have service id specified by peer part or function part"), - )), - } -} - -fn parse_args(args: Vec, data: &AquaData) -> Result { - let mut result = Vec::with_capacity(args.len()); - - for arg in args { - let mut split_arg: Vec<&str> = arg.splitn(1, '.').collect(); - let variable_name = split_arg.remove(0); - - let value_by_key = data - .get(variable_name) - .ok_or_else(|| AquamarineError::VariableNotFound(String::from(variable_name)))?; - - let value = if !split_arg.is_empty() { - let json_path = split_arg.remove(0); - let values = jsonpath_lib::select(&value_by_key, json_path) - .map_err(|e| AquamarineError::VariableNotInJsonPath(String::from(json_path), e))?; - if values.len() != 1 { - return Err(AquamarineError::MultipleValuesInJsonPath(String::from( - json_path, - ))); - } - - values[0].clone() - } else { - value_by_key.clone() - }; - - result.push(value); - } - - Ok(serde_json::Value::Array(result)) -} - -fn parse_result_name(result_name: String) -> Result { - if !result_name.is_empty() { - Ok(result_name) - } else { - Err(AquamarineError::InstructionError(String::from( - "result name of a call instruction must be non empty", - ))) - } -} diff --git a/src/instructions/mod.rs b/src/instructions/mod.rs deleted file mode 100644 index bb44260b..00000000 --- a/src/instructions/mod.rs +++ /dev/null @@ -1,49 +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. - */ - -mod call; -mod null; - -pub(self) use crate::stepper::ExecutableInstruction; - -use crate::AquaData; -use crate::Result; -use call::Call; -use null::Null; - -use serde_derive::Deserialize; -use serde_derive::Serialize; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(rename_all = "kebab-case")] -pub(crate) enum Instruction { - Null(Null), - Call(Call), - /* - Par(Box, Box), - Seq(Box, Box), - - */ -} - -impl ExecutableInstruction for Instruction { - fn execute(self, data: &mut AquaData, next_peer_pks: &mut Vec) -> Result<()> { - match self { - Instruction::Null(null) => null.execute(data, next_peer_pks), - Instruction::Call(call) => call.execute(data, next_peer_pks), - } - } -} diff --git a/src/stepper/execution.rs b/src/stepper/execution.rs deleted file mode 100644 index 7ab345cb..00000000 --- a/src/stepper/execution.rs +++ /dev/null @@ -1,51 +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. - */ - -use super::StepperOutcome; -use crate::instructions::Instruction; -use crate::AquaData; -use crate::Result; - -pub(crate) fn execute_aqua(init_user_id: String, aqua: String, data: String) -> StepperOutcome { - log::info!( - "stepper invoked with user_id = {}, aqua = {:?}, data = {:?}", - init_user_id, - aqua, - data - ); - - execute_aqua_impl(init_user_id, aqua, data).unwrap_or_else(Into::into) -} - -fn execute_aqua_impl(init_user_id: String, aqua: String, data: String) -> Result { - let mut parsed_data: AquaData = serde_json::from_str(&data)?; - let parsed_aqua = serde_sexpr::from_str::>(&aqua)?; - - log::info!( - "parsed_aqua: {:?}\nparsed_data: {:?}", - parsed_aqua, - parsed_data - ); - - let next_peer_pks = super::stepper::execute(parsed_aqua, &mut parsed_data)?; - let data = serde_json::to_string(&parsed_data)?; - - Ok(StepperOutcome { - ret_code: 0, - data, - next_peer_pks, - }) -} diff --git a/src/stepper/mod.rs b/src/stepper/mod.rs deleted file mode 100644 index a562f9b8..00000000 --- a/src/stepper/mod.rs +++ /dev/null @@ -1,25 +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. - */ - -mod execution; -mod stepper; -mod stepper_outcome; - -pub use stepper_outcome::StepperOutcome; -pub use stepper_outcome::SUCCESS_ERROR_CODE; - -pub(crate) use execution::execute_aqua; -pub(crate) use stepper::ExecutableInstruction; diff --git a/src/stepper/stepper.rs b/src/stepper/stepper.rs deleted file mode 100644 index 49197f73..00000000 --- a/src/stepper/stepper.rs +++ /dev/null @@ -1,33 +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. - */ - -use crate::instructions::Instruction; -use crate::AquaData; -use crate::Result; - -pub(crate) trait ExecutableInstruction { - fn execute(self, data: &mut AquaData, next_peer_pks: &mut Vec) -> Result<()>; -} - -pub(crate) fn execute(instructions: Vec, data: &mut AquaData) -> Result> { - let mut next_peer_pks = Vec::new(); - - for instruction in instructions { - instruction.execute(data, &mut next_peer_pks)?; - } - - Ok(next_peer_pks) -} diff --git a/stepper/Cargo.toml b/stepper/Cargo.toml new file mode 100644 index 00000000..c7e0e97a --- /dev/null +++ b/stepper/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "aquamarine" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[lib] +name = "aquamarine_client" +crate-type = ["cdylib"] +path = "src/wasm_bindgen.rs" + +[[bin]] +name = "aquamarine" +path = "src/fce.rs" + +[dependencies] +fluence = { git = "https://github.com/fluencelabs/rust-sdk", features = ["logger"] } + +serde = { version = "1.0.116", features = [ "derive", "rc" ] } +serde_derive = "1.0.116" +serde_sexpr = "0.1.0" + +jsonpath_lib = "0.2.5" + +log = "0.4.11" +serde_json = "1.0" +wasm-bindgen = "0.2.68" + +[dev_dependencies] +aqua-test-utils = { path = "../crates/test-utils" } +aquamarine-vm = { git = "https://github.com/fluencelabs/fce" } + +env_logger = "0.7.1" +serde_json = "1.0.56" diff --git a/stepper/src/air/call.rs b/stepper/src/air/call.rs new file mode 100644 index 00000000..f4e2c1a4 --- /dev/null +++ b/stepper/src/air/call.rs @@ -0,0 +1,274 @@ +/* + * 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. + */ + +use super::ExecutionContext; +use crate::AquamarineError; +use crate::JValue; +use crate::Result; + +use serde_derive::Deserialize; +use serde_derive::Serialize; + +const CURRENT_PEER_ALIAS: &str = "%current_peer_id%"; + +/* + (current) + (pk $pk) + (pk $pk $srv_id) + PEER_PART: resolves to (peer_pk) \/ (peer_pk, pk_srv_id) + + (fn $name) + (fn $name $srv_id) + FN_PART: resolves to (fn_name) \/ (fn_srv_id, fn_name) +*/ + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +#[serde(untagged)] +pub enum PeerPart { + PeerPk(String), + PeerPkWithPkServiceId(String, String), +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +#[serde(untagged)] +pub enum FunctionPart { + FuncName(String), + ServiceIdWithFuncName(String, String), +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +pub(crate) struct Call(PeerPart, FunctionPart, Vec, String); + +impl super::ExecutableInstruction for Call { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("call {:?} is called with context {:?}", self, ctx); + + let peer_part = &self.0; + let function_part = &self.1; + let arguments = &self.2; + let result_variable_name = &self.3; + + let (peer_pk, service_id, func_name) = parse_peer_fn_parts(peer_part, function_part)?; + let function_args = parse_args(arguments, ctx)?; + let function_args = serde_json::to_string(&function_args) + .map_err(|e| AquamarineError::FuncArgsSerdeError(function_args, e))?; + let result_variable_name = parse_result_variable_name(result_variable_name)?; + + if peer_pk == ctx.current_peer_id || peer_pk == CURRENT_PEER_ALIAS { + let result = unsafe { + crate::call_service(service_id.to_string(), func_name.to_string(), function_args) + }; + if result.ret_code != crate::CALL_SERVICE_SUCCESS { + return Err(AquamarineError::LocalServiceError(result.result)); + } + + let result: JValue = serde_json::from_str(&result.result) + .map_err(|e| AquamarineError::CallServiceSerdeError(result, e))?; + set_result(ctx, result_variable_name, result)?; + } else { + ctx.next_peer_pks.push(peer_pk.to_string()); + } + + Ok(()) + } +} + +#[rustfmt::skip] +fn parse_peer_fn_parts<'a>( + peer_part: &'a PeerPart, + fn_part: &'a FunctionPart, +) -> Result<(&'a str, &'a str, &'a str)> { + match (peer_part, fn_part) { + (PeerPart::PeerPkWithPkServiceId(peer_pk, peer_service_id), FunctionPart::ServiceIdWithFuncName(_service_id, func_name)) => { + Ok((peer_pk, peer_service_id, func_name)) + }, + (PeerPart::PeerPkWithPkServiceId(peer_pk, peer_service_id), FunctionPart::FuncName(func_name)) => { + Ok((peer_pk, peer_service_id, func_name)) + }, + (PeerPart::PeerPk(peer_pk), FunctionPart::ServiceIdWithFuncName(service_id, func_name)) => { + Ok((peer_pk, service_id, func_name)) + } + (PeerPart::PeerPk(_), FunctionPart::FuncName(_)) => Err(AquamarineError::InstructionError( + String::from("call should have service id specified by peer part or function part"), + )), + } +} + +#[rustfmt::skip] +fn parse_args(args: &[String], ctx: &ExecutionContext) -> Result { + let mut result = Vec::with_capacity(args.len()); + + for arg in args { + let mut split_arg: Vec<&str> = arg.splitn(2, '.').collect(); + let variable_name = split_arg.remove(0); + + let value_by_key = match (ctx.data.get(variable_name), ctx.folds.get(variable_name)) { + (_, Some(fold_state)) => match ctx.data.get(&fold_state.iterable_name) { + Some(JValue::Array(values)) => &values[fold_state.cursor], + Some(v) => return Err(AquamarineError::IncompatibleJValueType(v.clone(), String::from("array"))), + None => return Err(AquamarineError::VariableNotFound(fold_state.iterable_name.clone())), + }, + (Some(value), None) => value, + (None, None) => return Err(AquamarineError::VariableNotFound(variable_name.to_string())), + }; + + let value = if !split_arg.is_empty() { + let json_path = split_arg.remove(0); + let values = jsonpath_lib::select(value_by_key, json_path) + .map_err(|e| AquamarineError::VariableNotInJsonPath(String::from(json_path), e))?; + + if values.len() != 1 { + return Err(AquamarineError::MultipleValuesInJsonPath(String::from( + json_path, + ))); + } + + values[0].clone() + } else { + value_by_key.clone() + }; + + result.push(value); + } + + Ok(JValue::Array(result)) +} + +fn parse_result_variable_name(result_name: &str) -> Result<&str> { + if !result_name.is_empty() { + Ok(result_name) + } else { + Err(AquamarineError::InstructionError(String::from( + "result name of a call instruction must be non empty", + ))) + } +} + +fn set_result( + ctx: &mut ExecutionContext, + result_variable_name: &str, + result: JValue, +) -> Result<()> { + use std::collections::hash_map::Entry; + + let is_array = result_variable_name.ends_with("[]"); + if !is_array { + if ctx + .data + .insert(result_variable_name.to_string(), result) + .is_some() + { + return Err(AquamarineError::MultipleVariablesFound( + result_variable_name.to_string(), + )); + } + + return Ok(()); + } + + match ctx + .data + // unwrap is safe because it's been checked for [] + .entry(result_variable_name.strip_suffix("[]").unwrap().to_string()) + { + Entry::Occupied(mut entry) => match entry.get_mut() { + JValue::Array(values) => values.push(result), + v => { + return Err(AquamarineError::IncompatibleJValueType( + v.clone(), + String::from("Array"), + )) + } + }, + Entry::Vacant(entry) => { + entry.insert(JValue::Array(vec![result])); + } + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use crate::JValue; + + use aqua_test_utils::create_aqua_vm; + use aqua_test_utils::echo_string_call_service; + + use serde_json::json; + + #[test] + fn current_peer_id_call() { + let mut vm = create_aqua_vm(echo_string_call_service()); + + let script = String::from( + r#" + (call (%current_peer_id% (local_service_id local_fn_name) (value) result_name)) + "#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + script, + String::from("{\"value\": \"test\"}"), + ])) + .expect("call should be successful"); + + let res: JValue = serde_json::from_str(&res.data).unwrap(); + + assert_eq!(res.get("result_name").unwrap(), &json!("test")); + + let script = String::from( + r#" + (call (test_peer_id (local_service_id local_fn_name) (value) result_name)) + "#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + script, + String::from("{\"value\": \"test\"}"), + ])) + .expect("call should be successful"); + + let res: JValue = serde_json::from_str(&res.data).unwrap(); + + assert_eq!(res.get("result_name").unwrap(), &json!("test")); + } + + #[test] + fn remote_peer_id_call() { + let mut vm = create_aqua_vm(echo_string_call_service()); + let remote_peer_id = String::from("some_remote_peer_id"); + + let script = format!( + "(call ({} (local_service_id local_fn_name) (value) result_name))", + remote_peer_id + ); + + let res = vm + .call(json!([ + String::from("asd"), + script, + String::from("{\"value\": \"test\"}"), + ])) + .expect("call should be successful"); + + assert_eq!(res.next_peer_pks, vec![remote_peer_id]); + } +} diff --git a/stepper/src/air/fold.rs b/stepper/src/air/fold.rs new file mode 100644 index 00000000..87a26593 --- /dev/null +++ b/stepper/src/air/fold.rs @@ -0,0 +1,272 @@ +/* + * 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. + */ + +use super::ExecutionContext; +use super::Instruction; +use crate::AquamarineError; +use crate::JValue; +use crate::Result; + +use serde_derive::Deserialize; +use serde_derive::Serialize; +use std::rc::Rc; + +/* + (fold Iterable i + (par + (call fn [i] acc[]) + (next i) + ) + ) +*/ + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +pub(crate) struct Fold(String, String, Rc); + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +pub(crate) struct Next(String); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) struct FoldState { + pub(crate) cursor: usize, + pub(crate) iterable_name: String, + pub(crate) instr_head: Rc, +} + +impl super::ExecutableInstruction for Fold { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("fold {:?} is called with context {:?}", self, ctx); + + let iterable_name = &self.0; + let iterator_name = &self.1; + let instr_head = self.2.clone(); + + // check that value exists and has array type + match ctx.data.get(iterable_name) { + Some(JValue::Array(_)) => {} + Some(v) => { + return Err(AquamarineError::IncompatibleJValueType( + v.clone(), + String::from("Array"), + )) + } + None => { + return Err(AquamarineError::VariableNotFound(String::from( + iterable_name, + ))) + } + }; + + let fold_state = FoldState { + cursor: 0, + iterable_name: iterable_name.clone(), + instr_head: instr_head.clone(), + }; + + if ctx + .folds + .insert(iterator_name.clone(), fold_state) + .is_some() + { + return Err(AquamarineError::MultipleFoldStates(iterable_name.clone())); + } + + instr_head.execute(ctx)?; + ctx.folds.remove(iterator_name); + + Ok(()) + } +} + +impl super::ExecutableInstruction for Next { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("next {:?} is called with context {:?}", self, ctx); + + let iterator_name = &self.0; + let fold_state = ctx + .folds + .get_mut(iterator_name) + .ok_or_else(|| AquamarineError::FoldStateNotFound(iterator_name.clone()))?; + let value = ctx + .data + .get(&fold_state.iterable_name) + .expect("this has been checked on the fold instruction"); + let value_len = match value { + JValue::Array(array) => array.len(), + _ => unreachable!(), + }; + + fold_state.cursor += 1; + if value_len == 0 || value_len <= fold_state.cursor { + fold_state.cursor -= 1; + // just do nothing to exit + return Ok(()); + } + + let next_instr = fold_state.instr_head.clone(); + next_instr.execute(ctx)?; + + // get the same fold state again because of borrow checker + match ctx.folds.get_mut(iterator_name) { + Some(fold_state) => fold_state.cursor -= 1, + _ => unreachable!("iterator value shouldn't changed inside fold"), + }; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use crate::JValue; + + use aqua_test_utils::create_aqua_vm; + use aqua_test_utils::echo_number_call_service; + use aquamarine_vm::AquamarineVMError; + use aquamarine_vm::StepperError; + + use serde_json::json; + + #[test] + fn lfold() { + let mut vm = create_aqua_vm(echo_number_call_service()); + + let lfold = String::from( + r#" + (fold (Iterable i + (seq ( + (call (%current_peer_id% (local_service_id local_fn_name) (i) acc[])) + (next i) + ) + )))"#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + lfold, + String::from("{\"Iterable\": [\"1\",\"2\",\"3\",\"4\",\"5\"]}"), + ])) + .expect("call should be successful"); + + let res: JValue = serde_json::from_str(&res.data).unwrap(); + + assert_eq!(res.get("acc").unwrap(), &json!([1, 2, 3, 4, 5])); + } + + #[test] + fn rfold() { + let mut vm = create_aqua_vm(echo_number_call_service()); + + let rfold = String::from( + r#" + (fold (Iterable i + (seq ( + (next i) + (call (%current_peer_id% (local_service_id local_fn_name) (i) acc[])) + ) + )))"#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + rfold, + String::from("{\"Iterable\": [\"1\",\"2\",\"3\",\"4\",\"5\"]}"), + ])) + .expect("call should be successful"); + + let res: JValue = serde_json::from_str(&res.data).unwrap(); + + assert_eq!(res.get("acc").unwrap(), &json!([5, 4, 3, 2, 1])); + } + + #[test] + fn inner_fold() { + let mut vm = create_aqua_vm(echo_number_call_service()); + + let script = String::from( + r#" + (fold (Iterable1 i + (seq ( + (fold (Iterable2 j + (seq ( + (call (%current_peer_id% (local_service_id local_fn_name) (i) acc[])) + (next j) + )) + )) + (next i) + )) + ))"#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + script, + String::from("{\"Iterable1\": [\"1\",\"2\",\"3\",\"4\",\"5\"], \"Iterable2\": [\"1\",\"2\",\"3\",\"4\",\"5\"]}"), + ])) + .expect("call should be successful"); + + let res: JValue = serde_json::from_str(&res.data).unwrap(); + + assert_eq!( + res.get("acc").unwrap(), + &json!([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5]) + ); + } + + #[test] + fn inner_fold_with_same_iterator() { + let mut vm = create_aqua_vm(echo_number_call_service()); + + let script = String::from( + r#" + (fold (Iterable1 i + (seq ( + (fold (Iterable2 i + (seq ( + (call (%current_peer_id% (local_service_id local_fn_name) (i) acc[])) + (next i) + )) + )) + (next i) + )) + ))"#, + ); + + let res = vm + .call(json!([ + String::from("asd"), + script, + String::from("{\"Iterable1\": [\"1\",\"2\",\"3\",\"4\",\"5\"], \"Iterable2\": [\"1\",\"2\",\"3\",\"4\",\"5\"]}"), + ])); + + assert!(res.is_err()); + let error = res.err().unwrap(); + let error = match error { + AquamarineVMError::StepperError(error) => error, + _ => unreachable!(), + }; + + assert_eq!( + error, + StepperError::MultipleFoldStates(String::from( + "multiple fold states found for iterable Iterable2" + )) + ); + } +} diff --git a/stepper/src/air/mod.rs b/stepper/src/air/mod.rs new file mode 100644 index 00000000..14edfb62 --- /dev/null +++ b/stepper/src/air/mod.rs @@ -0,0 +1,82 @@ +/* + * 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. + */ + +mod call; +mod fold; +mod null; +mod par; +mod seq; + +use crate::AquaData; +use crate::Result; +use call::Call; +use fold::Fold; +use fold::FoldState; +use fold::Next; +use null::Null; +use par::Par; +use seq::Seq; + +use serde_derive::Deserialize; +use serde_derive::Serialize; +use std::collections::HashMap; + +#[derive(Clone, Default, Debug)] +pub(super) struct ExecutionContext { + pub data: AquaData, + pub next_peer_pks: Vec, + pub current_peer_id: String, + pub folds: HashMap, +} + +impl ExecutionContext { + pub(super) fn new(data: AquaData, current_peer_id: String) -> Self { + Self { + data, + next_peer_pks: vec![], + current_peer_id, + folds: HashMap::new(), + } + } +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +#[serde(rename_all = "kebab-case")] +pub(crate) enum Instruction { + Null(Null), + Call(Call), + Fold(Fold), + Next(Next), + Par(Par), + Seq(Seq), +} + +pub(crate) trait ExecutableInstruction { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()>; +} + +impl ExecutableInstruction for Instruction { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + match self { + Instruction::Null(null) => null.execute(ctx), + Instruction::Call(call) => call.execute(ctx), + Instruction::Fold(fold) => fold.execute(ctx), + Instruction::Next(next) => next.execute(ctx), + Instruction::Par(par) => par.execute(ctx), + Instruction::Seq(seq) => seq.execute(ctx), + } + } +} diff --git a/src/instructions/null.rs b/stepper/src/air/null.rs similarity index 80% rename from src/instructions/null.rs rename to stepper/src/air/null.rs index c26f48e8..a418efc6 100644 --- a/src/instructions/null.rs +++ b/stepper/src/air/null.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -use crate::AquaData; +use super::ExecutionContext; use crate::Result; use serde_derive::Deserialize; @@ -24,8 +24,8 @@ use serde_derive::Serialize; pub(crate) struct Null {} impl super::ExecutableInstruction for Null { - fn execute(self, data: &mut AquaData, next_peer_pks: &mut Vec) -> Result<()> { - log::info!("null called with data: {:?} and next_peer_pks: {:?}", data, next_peer_pks); + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("null is called with context: {:?}", ctx); Ok(()) } diff --git a/stepper/src/air/par.rs b/stepper/src/air/par.rs new file mode 100644 index 00000000..d65dd3c9 --- /dev/null +++ b/stepper/src/air/par.rs @@ -0,0 +1,73 @@ +/* + * 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. + */ + +use super::ExecutionContext; +use super::Instruction; +use crate::Result; + +use serde_derive::Deserialize; +use serde_derive::Serialize; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +pub(crate) struct Par(Box, Box); + +impl super::ExecutableInstruction for Par { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("par is called with context: {:?}", ctx); + + self.0.execute(ctx)?; + self.1.execute(ctx)?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use aqua_test_utils::create_aqua_vm; + use aqua_test_utils::unit_call_service; + use aquamarine_vm::StepperOutcome; + + use serde_json::json; + + #[test] + fn par() { + let mut vm = create_aqua_vm(unit_call_service()); + + let script = String::from( + r#" + (par ( + (call (remote_peer_id_1 (local_service_id local_fn_name) () result_name)) + (call (remote_peer_id_2 (service_id fn_name) () g)) + ))"#, + ); + + let res = vm + .call(json!([String::from("asd"), script, String::from("{}"),])) + .expect("call should be successful"); + + assert_eq!( + res, + StepperOutcome { + data: String::from("{}"), + next_peer_pks: vec![ + String::from("remote_peer_id_1"), + String::from("remote_peer_id_2") + ] + } + ); + } +} diff --git a/stepper/src/air/seq.rs b/stepper/src/air/seq.rs new file mode 100644 index 00000000..fd695e7b --- /dev/null +++ b/stepper/src/air/seq.rs @@ -0,0 +1,74 @@ +/* + * 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. + */ + +use super::ExecutionContext; +use super::Instruction; +use crate::Result; + +use serde_derive::Deserialize; +use serde_derive::Serialize; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +pub(crate) struct Seq(Box, Box); + +impl super::ExecutableInstruction for Seq { + fn execute(&self, ctx: &mut ExecutionContext) -> Result<()> { + log::info!("seq is called with context: {:?}", ctx); + + let pks_count_before_call = ctx.next_peer_pks.len(); + self.0.execute(ctx)?; + + if pks_count_before_call == ctx.next_peer_pks.len() { + self.1.execute(ctx)?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use aqua_test_utils::create_aqua_vm; + use aqua_test_utils::unit_call_service; + use aquamarine_vm::StepperOutcome; + + use serde_json::json; + + #[test] + fn par() { + let mut vm = create_aqua_vm(unit_call_service()); + + let script = String::from( + r#" + (seq ( + (call (remote_peer_id_1 (local_service_id local_fn_name) () result_name)) + (call (remote_peer_id_2 (service_id fn_name) () g)) + ))"#, + ); + + let res = vm + .call(json!([String::from("asd"), script, String::from("{}"),])) + .expect("call should be successful"); + + assert_eq!( + res, + StepperOutcome { + data: String::from("{}"), + next_peer_pks: vec![String::from("remote_peer_id_1")] + } + ); + } +} diff --git a/src/defines.rs b/stepper/src/defines.rs similarity index 75% rename from src/defines.rs rename to stepper/src/defines.rs index b02e2146..8de6e60b 100644 --- a/src/defines.rs +++ b/stepper/src/defines.rs @@ -14,20 +14,21 @@ * limitations under the License. */ -/// This file contains defines similar for both FCE and browser targets. - -pub(crate) type Result = std::result::Result; -pub(crate) type AquaData = std::collections::HashMap; -pub(crate) use crate::errors::AquamarineError; -pub(crate) use crate::stepper::StepperOutcome; - -pub(crate) const CALL_SERVICE_SUCCESS: i32 = 0; - use serde_derive::Deserialize; use serde_derive::Serialize; +/// This file contains defines of some things similar both for FCE and browser targets. + +pub(crate) type Result = std::result::Result; +pub(crate) type AquaData = std::collections::HashMap; +pub(crate) type JValue = serde_json::Value; +pub(crate) use crate::errors::AquamarineError; +pub(crate) use crate::stepper_outcome::StepperOutcome; + +pub(crate) const CALL_SERVICE_SUCCESS: i32 = 0; + #[fluence::fce] -#[derive(Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct CallServiceResult { pub ret_code: i32, pub result: String, diff --git a/stepper/src/errors.rs b/stepper/src/errors.rs new file mode 100644 index 00000000..b1b1a9de --- /dev/null +++ b/stepper/src/errors.rs @@ -0,0 +1,182 @@ +/* + * 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. + */ + +use crate::CallServiceResult; +use crate::JValue; +use crate::StepperOutcome; + +use jsonpath_lib::JsonPathError; +use serde_json::Error as SerdeJsonError; +use serde_sexpr::Error as SExprError; + +use std::convert::Into; +use std::env::VarError; +use std::error::Error; + +#[derive(Debug)] +pub(crate) enum AquamarineError { + /// Errors occurred while parsing aqua script in the form of S expressions. + SExprParseError(SExprError), + + /// Errors occurred while parsing aqua data. + DataSerdeError(SerdeJsonError), + + /// Errors occurred while parsing function arguments of an expression. + FuncArgsSerdeError(JValue, SerdeJsonError), + + /// Errors occurred while parsing returned by call_service value. + CallServiceSerdeError(CallServiceResult, SerdeJsonError), + + /// Indicates that environment variable with name CURRENT_PEER_ID isn't set. + CurrentPeerIdEnvError(VarError, 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, JsonPathError), + + /// Value for such name isn't presence in data. + IncompatibleJValueType(JValue, 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), +} + +impl Error for AquamarineError {} + +impl std::fmt::Display for AquamarineError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + match self { + AquamarineError::SExprParseError(err) => { + write!(f, "aqua script can't be parsed: {:?}", err) + } + AquamarineError::DataSerdeError(err) => write!( + f, + "an error occurred while serializing/deserializing data: {:?}", + err + ), + AquamarineError::FuncArgsSerdeError(args, err) => write!( + f, + "function arguments {} can't be serialized or deserialized with an error: {:?}", + args, err + ), + AquamarineError::CallServiceSerdeError(result, err) => write!( + f, + "call_service result \"{:?}\" can't be serialized or deserialized with an error: {:?}", + result, err + ), + AquamarineError::CurrentPeerIdEnvError(err, env_name) => write!( + f, + "the environment variable \"{}\" can't be obtained: {:?}", + env_name, + err + ), + AquamarineError::InstructionError(err_msg) => write!(f, "{}", err_msg), + AquamarineError::LocalServiceError(err_msg) => write!(f, "{}", err_msg), + AquamarineError::VariableNotFound(variable_name) => write!( + f, + "variable with name {} isn't present in data", + variable_name + ), + AquamarineError::MultipleVariablesFound(variable_name) => write!( + f, + "multiple variables found for name {} in data", + variable_name + ), + AquamarineError::VariableNotInJsonPath(json_path, json_path_err) => write!( + f, + "variable with path {} not found with error: {:?}", + json_path, json_path_err + ), + AquamarineError::IncompatibleJValueType(avalue, desired_type) => write!( + f, + "got avalue \"{:?}\", but {} type is needed", + avalue, + desired_type, + ), + AquamarineError::MultipleValuesInJsonPath(json_path) => write!( + f, + "multiple variables found for this json path {}", + json_path + ), + AquamarineError::FoldStateNotFound(iterator) => write!( + f, + "fold state not found for this iterable {}", + iterator + ), + AquamarineError::MultipleFoldStates(iterator) => write!( + f, + "multiple fold states found for iterable {}", + iterator + ), + } + } +} + +impl From for AquamarineError { + fn from(err: SExprError) -> Self { + AquamarineError::SExprParseError(err) + } +} + +impl From for AquamarineError { + fn from(_: std::convert::Infallible) -> Self { + unreachable!() + } +} + +impl Into for AquamarineError { + fn into(self) -> StepperOutcome { + let ret_code = match self { + AquamarineError::SExprParseError(_) => 1, + AquamarineError::DataSerdeError(..) => 2, + AquamarineError::FuncArgsSerdeError(..) => 3, + AquamarineError::CallServiceSerdeError(..) => 4, + AquamarineError::CurrentPeerIdEnvError(..) => 5, + AquamarineError::InstructionError(..) => 6, + AquamarineError::LocalServiceError(..) => 7, + AquamarineError::VariableNotFound(..) => 8, + AquamarineError::MultipleVariablesFound(..) => 9, + AquamarineError::VariableNotInJsonPath(..) => 10, + AquamarineError::IncompatibleJValueType(..) => 11, + AquamarineError::MultipleValuesInJsonPath(..) => 12, + AquamarineError::FoldStateNotFound(..) => 13, + AquamarineError::MultipleFoldStates(..) => 14, + }; + + StepperOutcome { + ret_code, + data: format!("{}", self), + next_peer_pks: vec![], + } + } +} diff --git a/stepper/src/execution.rs b/stepper/src/execution.rs new file mode 100644 index 00000000..839a2033 --- /dev/null +++ b/stepper/src/execution.rs @@ -0,0 +1,120 @@ +/* + * 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. + */ + +use super::StepperOutcome; +use crate::air::ExecutableInstruction; +use crate::air::ExecutionContext; +use crate::air::Instruction; +use crate::AquaData; +use crate::AquamarineError; +use crate::Result; + +const CURRENT_PEER_ID_ENV_NAME: &str = "CURRENT_PEER_ID"; + +pub(crate) fn execute_aqua(init_user_id: String, aqua: String, data: String) -> StepperOutcome { + log::info!( + "stepper invoked with user_id = {}, aqua = {:?}, data = {:?}", + init_user_id, + aqua, + data + ); + + execute_aqua_impl(init_user_id, aqua, data).unwrap_or_else(Into::into) +} + +fn execute_aqua_impl(_init_user_id: String, aqua: String, data: String) -> Result { + let parsed_data: AquaData = + serde_json::from_str(&data).map_err(AquamarineError::DataSerdeError)?; + let formatted_aqua = format_aqua(aqua); + let parsed_aqua = serde_sexpr::from_str::(&formatted_aqua)?; + + log::info!( + "\nparsed_aqua: {:?}\nparsed_data: {:?}", + parsed_aqua, + parsed_data + ); + + let current_peer_id = std::env::var(CURRENT_PEER_ID_ENV_NAME).map_err(|e| { + AquamarineError::CurrentPeerIdEnvError(e, String::from(CURRENT_PEER_ID_ENV_NAME)) + })?; + + let mut execution_ctx = ExecutionContext::new(parsed_data, current_peer_id); + parsed_aqua.execute(&mut execution_ctx)?; + + let data = + serde_json::to_string(&execution_ctx.data).map_err(AquamarineError::DataSerdeError)?; + + Ok(StepperOutcome { + ret_code: 0, + data, + next_peer_pks: execution_ctx.next_peer_pks, + }) +} + +/// Formats aqua script in a form of S-expressions to a form compatible with the serde_sexpr crate. +fn format_aqua(aqua: String) -> String { + use std::iter::FromIterator; + + let mut formatted_aqua = Vec::with_capacity(aqua.len()); + // whether to skip the next whitespace + let mut skip_next_whitespace = false; + // whether c was a closing brace + let mut was_cbr = false; + + for c in aqua.chars() { + let is_whitespace = c == ' '; + if (skip_next_whitespace && is_whitespace) || c == '\n' { + continue; + } + + let is_cbr = c == ')'; + + skip_next_whitespace = is_whitespace || c == '(' || is_cbr; + if was_cbr && !is_cbr { + formatted_aqua.push(' '); + } + + was_cbr = is_cbr; + formatted_aqua.push(c) + } + + String::from_iter(formatted_aqua.into_iter()) +} + +#[cfg(test)] +mod tests { + #[test] + fn format_aqua_test() { + let aqua = format!( + r#"(( (( (seq ( + (call (%current_peer_id% (add_module ||) (module) module)) + (seq ( + (call (%current_peer_id% (add_blueprint ||) (blueprint) blueprint_id)) + (seq ( + (call (%current_peer_id% (create ||) (blueprint_id) service_id)) + (call ({} (|| ||) (service_id) client_result)) + ) ) + ) ) + ))"#, + "abc" + ); + + let aqua = super::format_aqua(aqua); + let formatted_aqua = String::from("(((((seq ((call (%current_peer_id% (add_module ||) (module) module)) (seq ((call (%current_peer_id% (add_blueprint ||) (blueprint) blueprint_id)) (seq ((call (%current_peer_id% (create ||) (blueprint_id) service_id)) (call (abc (|| ||) (service_id) client_result))))))))"); + + assert_eq!(aqua, formatted_aqua); + } +} diff --git a/src/fce.rs b/stepper/src/fce.rs similarity index 78% rename from src/fce.rs rename to stepper/src/fce.rs index eb251793..a7975fa4 100644 --- a/src/fce.rs +++ b/stepper/src/fce.rs @@ -14,15 +14,26 @@ * limitations under the License. */ +#![warn(rust_2018_idioms)] +#![deny( + dead_code, + nonstandard_style, + unused_imports, + unused_mut, + unused_variables, + unused_unsafe, + unreachable_patterns +)] + mod air; mod defines; mod errors; -mod instructions; -mod stepper; +mod execution; +mod stepper_outcome; pub(crate) use crate::defines::*; -use crate::stepper::execute_aqua; +use crate::execution::execute_aqua; use fluence::fce; pub fn main() { @@ -35,7 +46,7 @@ pub fn invoke(init_user_id: String, aqua: String, data: String) -> StepperOutcom } #[fce] -#[link(wasm_import_module = "aqua_test_module")] +#[link(wasm_import_module = "host")] extern "C" { pub fn call_service(service_id: String, fn_name: String, args: String) -> CallServiceResult; } diff --git a/src/stepper/stepper_outcome.rs b/stepper/src/stepper_outcome.rs similarity index 93% rename from src/stepper/stepper_outcome.rs rename to stepper/src/stepper_outcome.rs index 4efd5199..87fe3004 100644 --- a/src/stepper/stepper_outcome.rs +++ b/stepper/src/stepper_outcome.rs @@ -17,10 +17,8 @@ use fluence::fce; use serde::{Deserialize, Serialize}; -pub const SUCCESS_ERROR_CODE: i32 = 0; - #[fce] -#[derive(Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct StepperOutcome { /// A return code, where SUCCESS_ERROR_CODE means success. pub ret_code: i32, diff --git a/src/wasm_bindgen.rs b/stepper/src/wasm_bindgen.rs similarity index 95% rename from src/wasm_bindgen.rs rename to stepper/src/wasm_bindgen.rs index 86588683..ecad6444 100644 --- a/src/wasm_bindgen.rs +++ b/stepper/src/wasm_bindgen.rs @@ -17,12 +17,12 @@ mod air; mod defines; mod errors; -mod instructions; -mod stepper; +mod execution; +mod stepper_outcome; pub(crate) use crate::defines::*; -use crate::stepper::execute_aqua; +use crate::execution::execute_aqua; use wasm_bindgen::prelude::*; diff --git a/stepper/tests/basic.rs b/stepper/tests/basic.rs new file mode 100644 index 00000000..c37a014e --- /dev/null +++ b/stepper/tests/basic.rs @@ -0,0 +1,162 @@ +/* + * 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. + */ + +use aqua_test_utils::create_aqua_vm; +use aqua_test_utils::unit_call_service; +use aquamarine_vm::vec1::Vec1; +use aquamarine_vm::HostExportedFunc; +use aquamarine_vm::IValue; +use aquamarine_vm::StepperOutcome; + +use serde_json::json; + +type JValue = serde_json::Value; + +#[test] +fn seq_par_call() { + let mut vm = create_aqua_vm(unit_call_service()); + + let script = String::from( + r#" + (seq ( + (par ( + (call (%current_peer_id% (local_service_id local_fn_name) () result_1)) + (call (remote_peer_id (service_id fn_name) () g)) + )) + (call (%current_peer_id% (local_service_id local_fn_name) () result_2)) + ))"#, + ); + + let res = vm + .call(json!([String::from("asd"), script, String::from("{}"),])) + .expect("should be successful"); + let right_outcome = StepperOutcome { + data: String::from("{\"result_1\":\"test\"}"), + next_peer_pks: vec![String::from("remote_peer_id")], + }; + + assert_eq!(res, right_outcome); +} + +#[test] +fn par_par_call() { + let mut vm = create_aqua_vm(unit_call_service()); + + let script = String::from( + r#" + (par ( + (par ( + (call (%current_peer_id% (local_service_id local_fn_name) () result_1)) + (call (remote_peer_id (service_id fn_name) () g)) + )) + (call (%current_peer_id% (local_service_id local_fn_name) () result_2)) + ))"#, + ); + + let res = vm + .call(json!([String::from("asd"), script, String::from("{}"),])) + .expect("should be successful"); + + let resulted_json: JValue = + serde_json::from_str(&res.data).expect("stepper should return valid json"); + + let right_json = json!( {"result_1" : "test", "result_2" : "test"} ); + + assert_eq!(resulted_json, right_json); + assert_eq!(res.next_peer_pks, vec![String::from("remote_peer_id")]); +} + +#[test] +fn create_service() { + let module = "greeting"; + let config = json!( + { + "name": module, + "mem_pages_count": 100, + "logger_enabled": true, + "wasi": { + "envs": json!({}), + "preopened_files": vec!["/tmp"], + "mapped_dirs": json!({}), + } + } + ); + let mut data_value = json!({ + "module_bytes": vec![1,2], + "module_config": config, + "blueprint": { "name": "blueprint", "dependencies": [module] }, + }); + let data = data_value.to_string(); + + let script = String::from( + r#"(seq ( + (call (%current_peer_id% (add_module ||) (module_bytes module_config) module)) + (seq ( + (call (%current_peer_id% (add_blueprint ||) (blueprint) blueprint_id)) + (seq ( + (call (%current_peer_id% (create ||) (blueprint_id) service_id)) + (call (remote_peer_id (|| ||) (service_id) client_result)) + )) + )) + ))"#, + ); + + let call_service: HostExportedFunc = Box::new(|_, args| -> Option { + let builtin_service = match &args[0] { + IValue::String(str) => str, + _ => unreachable!(), + }; + + let response = match builtin_service.as_str() { + "add_module" => String::from("add_module response"), + "add_blueprint" => String::from("add_blueprint response"), + "create" => String::from("create response"), + _ => String::from("unknown response"), + }; + + Some(IValue::Record( + Vec1::new(vec![ + IValue::S32(0), + IValue::String(format!("\"{}\"", response)), + ]) + .unwrap(), + )) + }); + + let mut vm = create_aqua_vm(call_service); + + let res = vm + .call(json!([String::from("init_user_pk"), script, data,])) + .expect("should be successful"); + + let resulted_data: JValue = serde_json::from_str(&res.data).expect("should be correct json"); + + data_value.as_object_mut().unwrap().insert( + String::from("module"), + JValue::String(String::from("add_module response")), + ); + data_value.as_object_mut().unwrap().insert( + String::from("blueprint_id"), + JValue::String(String::from("add_blueprint response")), + ); + data_value.as_object_mut().unwrap().insert( + String::from("service_id"), + JValue::String(String::from("create response")), + ); + + assert_eq!(resulted_data, data_value); + assert_eq!(res.next_peer_pks, vec![String::from("remote_peer_id")]); +} diff --git a/test_module/main.rs b/test_module/main.rs deleted file mode 100644 index defb4537..00000000 --- a/test_module/main.rs +++ /dev/null @@ -1,22 +0,0 @@ -use fluence::fce; - -fn main() {} - -#[fce] -pub struct CallServiceResult { - pub ret_code: i32, - pub result: String, -} - -#[fce] -pub fn call_service(service_id: String, fn_name: String, args: String) -> CallServiceResult { - println!( - "call service invoked with:\n service_id: {}\n fn_name: {}\n args: {:?}", - service_id, fn_name, args - ); - - CallServiceResult { - ret_code: 0, - result: String::from("[\"result string\"]"), - } -}