This is an automated email from the ASF dual-hosted git repository. mgrigorov pushed a commit to branch avro-3558-demo-wasm in repository https://gitbox.apache.org/repos/asf/avro.git
commit 2d31b2b38a8e73aea70b61a1b01a4362eac2b07d Author: Martin Tzvetanov Grigorov <[email protected]> AuthorDate: Thu Jun 30 16:19:43 2022 +0300 AVRO-3558: Rust: Add a demo crate that shows usage as WebAssembly Signed-off-by: Martin Tzvetanov Grigorov <[email protected]> --- .github/workflows/test-lang-rust-ci.yml | 43 +++++++++++++++++ lang/rust/Cargo.toml | 3 +- lang/rust/wasm-demo/Cargo.toml | 46 ++++++++++++++++++ lang/rust/wasm-demo/README.md | 28 +++++++++++ lang/rust/wasm-demo/src/lib.rs | 17 +++++++ lang/rust/wasm-demo/tests/demos.rs | 82 +++++++++++++++++++++++++++++++++ 6 files changed, 218 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-lang-rust-ci.yml b/.github/workflows/test-lang-rust-ci.yml index 5c5bc9e8c..9796f1118 100644 --- a/.github/workflows/test-lang-rust-ci.yml +++ b/.github/workflows/test-lang-rust-ci.yml @@ -196,3 +196,46 @@ jobs: - name: Perl reads interop files created by Java and Rust working-directory: lang/perl run: ./build.sh interop-data-test + + web-assembly: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Rust Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + target: wasm32-unknown-unknown + + - name: Cache Cargo + uses: actions/cache@v2 + with: + # these represent dependencies downloaded by cargo + # and thus do not depend on the OS, arch nor rust version. + path: ~/.cargo + key: cargo-cache1- + + - name: Cache Rust dependencies + uses: actions/cache@v2 + with: + # these represent compiled steps of both dependencies and avro + # and thus are specific for a particular OS, arch and rust version. + path: ~/target + key: ${{ runner.os }}-target-cache1-stable- + + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + + - name: Install Firefox + run: apt install firefox + + - name: Build the Web Assembly demo app + run: wasm-pack build wasm-demo + + - name: Test the Web Assembly demo app + run: RUST_BACKTRACE=1 wasm-pack test --headless --firefox wasm-demo diff --git a/lang/rust/Cargo.toml b/lang/rust/Cargo.toml index bcda788a7..689a83e51 100644 --- a/lang/rust/Cargo.toml +++ b/lang/rust/Cargo.toml @@ -19,5 +19,6 @@ members = [ "avro_test_helper", "avro_derive", - "avro" + "avro", + "wasm-demo" ] diff --git a/lang/rust/wasm-demo/Cargo.toml b/lang/rust/wasm-demo/Cargo.toml new file mode 100644 index 000000000..9fa891300 --- /dev/null +++ b/lang/rust/wasm-demo/Cargo.toml @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +[package] +name = "hello-wasm" +version = "0.1.0" +authors = ["Apache Avro team <[email protected]>"] +description = "A demo project for testing apache_avro in WebAssembly" +license = "Apache-2.0" +readme = "README.md" +repository = "https://github.com/apache/avro" +edition = "2018" +keywords = ["avro", "data", "serialization", "wasm", "web assembly"] +categories = ["encoding"] +documentation = "https://docs.rs/apache-avro" + + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +apache-avro = { path = "../avro" } +serde = { default-features = false, version = "1.0.137", features = ["derive"] } +wasm-bindgen = "0.2.63" + +[dev-dependencies] +console_error_panic_hook = { version = "0.1.6" } +wasm-bindgen-test = "0.3.13" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/lang/rust/wasm-demo/README.md b/lang/rust/wasm-demo/README.md new file mode 100644 index 000000000..87d63641b --- /dev/null +++ b/lang/rust/wasm-demo/README.md @@ -0,0 +1,28 @@ +<!--- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +--> + +# About + +An application that is used to test `apache_avro` crate as a web assembly. + +The project is created with `wasm-pack new wasm-demo` command and simplified to not use unrelated technologies (like Wee and a panic hook). + +# Code + +See [tests](./tests/demos.rs) diff --git a/lang/rust/wasm-demo/src/lib.rs b/lang/rust/wasm-demo/src/lib.rs new file mode 100644 index 000000000..5cd17fb5a --- /dev/null +++ b/lang/rust/wasm-demo/src/lib.rs @@ -0,0 +1,17 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + diff --git a/lang/rust/wasm-demo/tests/demos.rs b/lang/rust/wasm-demo/tests/demos.rs new file mode 100644 index 000000000..08d9d21ec --- /dev/null +++ b/lang/rust/wasm-demo/tests/demos.rs @@ -0,0 +1,82 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +#![cfg(target_arch = "wasm32")] + +extern crate wasm_bindgen_test; + +use std::io::BufWriter; +use wasm_bindgen_test::*; + +use apache_avro::{from_value, to_value, types::Record, Codec, Reader, Schema, Writer}; +use serde::{Deserialize, Serialize}; + +wasm_bindgen_test_configure!(run_in_browser); + +#[derive(Deserialize, Serialize, Debug, PartialEq)] +pub struct MyRecord { + b: String, + a: i64, +} + +#[wasm_bindgen_test] +fn serialization_roundtrip() { + console_error_panic_hook::set_once(); + + let record = MyRecord { + b: "hello".to_string(), + a: 1, + }; + + let serialized = to_value(&record).unwrap(); + let deserialized = from_value::<MyRecord>(&serialized).unwrap(); + assert_eq!(deserialized, record); +} + +#[wasm_bindgen_test] +fn write_read() { + console_error_panic_hook::set_once(); + + let schema_str = r#" + { + "type": "record", + "name": "my_record", + "fields": [ + {"name": "a", "type": "long"}, + {"name": "b", "type": "string"} + ] + }"#; + let schema = Schema::parse_str(schema_str).unwrap(); + + let mut record = Record::new(&schema).unwrap(); + record.put("a", 12_i32); + record.put("b", "hello".to_owned()); + + let mut writer = Writer::with_codec(&schema, BufWriter::new(Vec::with_capacity(200)), Codec::Null); + writer.append(record).unwrap(); + writer.flush().unwrap(); + let bytes = writer.into_inner().unwrap().into_inner().unwrap(); + + let reader = Reader::new(&bytes[..]).unwrap(); + + for value in reader { + match value { + Ok(record) => println!("Successfully read {:?}", record), + Err(err) => panic!("An error occurred while reading: {:?}", err), + } + } +}
