From a04f4ce4ba365749c059c5b28bb1e62c2e31de75 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 19 Feb 2021 17:14:50 +0300 Subject: [PATCH 01/19] add MountedBinaryResult --- crates/main/src/lib.rs | 3 ++ crates/main/src/mounted_binary_result.rs | 37 ++++++++++++++++++++++++ src/lib.rs | 2 ++ 3 files changed, 42 insertions(+) create mode 100644 crates/main/src/mounted_binary_result.rs diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index 3fec6be..809e52b 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -35,6 +35,7 @@ mod call_parameters; mod export_allocator; #[cfg(any(feature = "debug", feature = "logger"))] mod logger; +mod mounted_binary_result; mod result; pub use call_parameters::CallParameters; @@ -52,6 +53,8 @@ pub use logger::TargetMap; #[cfg(feature = "logger")] pub use logger::WASM_LOG_ENV_NAME; +pub use mounted_binary_result::MountedBinaryResult; + pub use result::get_result_ptr; pub use result::get_result_size; pub use result::set_result_ptr; diff --git a/crates/main/src/mounted_binary_result.rs b/crates/main/src/mounted_binary_result.rs new file mode 100644 index 0000000..19e73ec --- /dev/null +++ b/crates/main/src/mounted_binary_result.rs @@ -0,0 +1,37 @@ +/* + * 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 fluence_sdk_macro::fce; + +use serde::Serialize; +use serde::Deserialize; + +pub const SUCCESS_CODE: i32 = 0; + +/// Describes result of calling a CLI service. +#[fce] +#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] +pub struct MountedBinaryResult { + /// Return code, where SUCCESS_CODE means succes. + pub ret_code: i32, + + /// Contains error message if ret_code != SUCCESS_CODE. + pub error_message: String, + + /// Contains an output of a CLI service. Note that it could be non-empty even if + /// there was an error. + pub result: String, +} diff --git a/src/lib.rs b/src/lib.rs index 28d5b4d..ea95e59 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,6 +79,8 @@ pub use fluence_sdk_main::WasmLoggerBuilder; #[cfg(feature = "logger")] pub use fluence_sdk_main::TargetMap; +pub use fluence_sdk_main::MountedBinaryResult; + /// These API functions are intended for internal usage in generated code. /// Normally, you shouldn't use them. pub mod internal { From b7274974f7804f588ca2b079162cd15f18cd2ced Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 19 Feb 2021 17:19:19 +0300 Subject: [PATCH 02/19] reexport SUCCESS_CODE --- crates/main/src/lib.rs | 1 + src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index 809e52b..a4ea5e0 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -54,6 +54,7 @@ pub use logger::TargetMap; pub use logger::WASM_LOG_ENV_NAME; pub use mounted_binary_result::MountedBinaryResult; +pub use mounted_binary_result::SUCCESS_CODE; pub use result::get_result_ptr; pub use result::get_result_size; diff --git a/src/lib.rs b/src/lib.rs index ea95e59..84f9f83 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,6 +80,7 @@ pub use fluence_sdk_main::WasmLoggerBuilder; pub use fluence_sdk_main::TargetMap; pub use fluence_sdk_main::MountedBinaryResult; +pub use fluence_sdk_main::SUCCESS_CODE; /// These API functions are intended for internal usage in generated code. /// Normally, you shouldn't use them. From 517b13e1ac15e4d277bb531e0dd605d348c9e8c3 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 19 Feb 2021 17:45:27 +0300 Subject: [PATCH 03/19] add two constructors --- crates/main/src/mounted_binary_result.rs | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/main/src/mounted_binary_result.rs b/crates/main/src/mounted_binary_result.rs index 19e73ec..bc9c815 100644 --- a/crates/main/src/mounted_binary_result.rs +++ b/crates/main/src/mounted_binary_result.rs @@ -35,3 +35,29 @@ pub struct MountedBinaryResult { /// there was an error. pub result: String, } + +impl MountedBinaryResult { + /// Create a new success MountedBinaryResult from the provided result. + pub fn success(result: String) -> Self { + let ret_code = SUCCESS_CODE; + let error_message = String::new(); + + Self { + ret_code, + error_message, + result, + } + } + + /// Create a new failure MountedBinaryResult from the provided ret_code and error_message. + pub fn error(ret_code: i32, error_message: impl Into) -> Self { + let error_message = error_message.into(); + let result = String::new(); + + Self { + ret_code, + error_message, + result, + } + } +} From 0943e59ee78c3f80780adba83241fffdeb0049f4 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 19 Feb 2021 18:31:16 +0300 Subject: [PATCH 04/19] add stdout/stderr fields --- crates/main/src/mounted_binary_result.rs | 34 +++++++----------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/crates/main/src/mounted_binary_result.rs b/crates/main/src/mounted_binary_result.rs index bc9c815..27cfa61 100644 --- a/crates/main/src/mounted_binary_result.rs +++ b/crates/main/src/mounted_binary_result.rs @@ -25,39 +25,23 @@ pub const SUCCESS_CODE: i32 = 0; #[fce] #[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] pub struct MountedBinaryResult { - /// Return code, where SUCCESS_CODE means succes. + /// Return process exit code or host execution error code, where SUCCESS_CODE means success. pub ret_code: i32, - /// Contains error message if ret_code != SUCCESS_CODE. - pub error_message: String, + /// The data that the process wrote to stdout. + pub stdout: Vec, - /// Contains an output of a CLI service. Note that it could be non-empty even if - /// there was an error. - pub result: String, + /// The data that the process wrote to stderr. + pub stderr: Vec, } impl MountedBinaryResult { - /// Create a new success MountedBinaryResult from the provided result. - pub fn success(result: String) -> Self { - let ret_code = SUCCESS_CODE; - let error_message = String::new(); - + /// Create a new failure MountedBinaryResult from the provided ret_code. + pub fn from_err_code(ret_code: i32) -> Self { Self { ret_code, - error_message, - result, - } - } - - /// Create a new failure MountedBinaryResult from the provided ret_code and error_message. - pub fn error(ret_code: i32, error_message: impl Into) -> Self { - let error_message = error_message.into(); - let result = String::new(); - - Self { - ret_code, - error_message, - result, + stdout: Vec::new(), + stderr: Vec::new(), } } } From feb7517126edafcdf7c86f7e753c9d731e6a2205 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 19 Feb 2021 22:50:38 +0300 Subject: [PATCH 05/19] add error --- crates/main/src/mounted_binary_result.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/main/src/mounted_binary_result.rs b/crates/main/src/mounted_binary_result.rs index 27cfa61..13ee98c 100644 --- a/crates/main/src/mounted_binary_result.rs +++ b/crates/main/src/mounted_binary_result.rs @@ -28,6 +28,9 @@ pub struct MountedBinaryResult { /// Return process exit code or host execution error code, where SUCCESS_CODE means success. pub ret_code: i32, + /// Contains the string representation of an error, if ret_code != SUCCESS_CODE. + pub error: String, + /// The data that the process wrote to stdout. pub stdout: Vec, @@ -37,9 +40,10 @@ pub struct MountedBinaryResult { impl MountedBinaryResult { /// Create a new failure MountedBinaryResult from the provided ret_code. - pub fn from_err_code(ret_code: i32) -> Self { + pub fn from_error(ret_code: i32, error: impl Into) -> Self { Self { ret_code, + error: error.into(), stdout: Vec::new(), stderr: Vec::new(), } From 3492f400575f194c305eee22d782d1d0b673e3fd Mon Sep 17 00:00:00 2001 From: vms Date: Mon, 22 Feb 2021 18:30:45 +0300 Subject: [PATCH 06/19] module renaming --- crates/main/src/lib.rs | 5 +---- .../src/{mounted_binary_result.rs => mounted_binary.rs} | 4 ++-- src/lib.rs | 6 ++++-- 3 files changed, 7 insertions(+), 8 deletions(-) rename crates/main/src/{mounted_binary_result.rs => mounted_binary.rs} (96%) diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index a4ea5e0..fc36a30 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -35,7 +35,7 @@ mod call_parameters; mod export_allocator; #[cfg(any(feature = "debug", feature = "logger"))] mod logger; -mod mounted_binary_result; +pub mod mounted_binary; mod result; pub use call_parameters::CallParameters; @@ -53,9 +53,6 @@ pub use logger::TargetMap; #[cfg(feature = "logger")] pub use logger::WASM_LOG_ENV_NAME; -pub use mounted_binary_result::MountedBinaryResult; -pub use mounted_binary_result::SUCCESS_CODE; - pub use result::get_result_ptr; pub use result::get_result_size; pub use result::set_result_ptr; diff --git a/crates/main/src/mounted_binary_result.rs b/crates/main/src/mounted_binary.rs similarity index 96% rename from crates/main/src/mounted_binary_result.rs rename to crates/main/src/mounted_binary.rs index 13ee98c..a6480e3 100644 --- a/crates/main/src/mounted_binary_result.rs +++ b/crates/main/src/mounted_binary.rs @@ -24,7 +24,7 @@ pub const SUCCESS_CODE: i32 = 0; /// Describes result of calling a CLI service. #[fce] #[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] -pub struct MountedBinaryResult { +pub struct Result { /// Return process exit code or host execution error code, where SUCCESS_CODE means success. pub ret_code: i32, @@ -38,7 +38,7 @@ pub struct MountedBinaryResult { pub stderr: Vec, } -impl MountedBinaryResult { +impl Result { /// Create a new failure MountedBinaryResult from the provided ret_code. pub fn from_error(ret_code: i32, error: impl Into) -> Self { Self { diff --git a/src/lib.rs b/src/lib.rs index 84f9f83..2a113b4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,8 +79,10 @@ pub use fluence_sdk_main::WasmLoggerBuilder; #[cfg(feature = "logger")] pub use fluence_sdk_main::TargetMap; -pub use fluence_sdk_main::MountedBinaryResult; -pub use fluence_sdk_main::SUCCESS_CODE; +pub mod mounted_binary { + pub use fluence_sdk_main::mounted_binary::Result; + pub use fluence_sdk_main::mounted_binary::SUCCESS_CODE; +} /// These API functions are intended for internal usage in generated code. /// Normally, you shouldn't use them. From 210fd72b892ca30078354d27ef06505ef468f0e8 Mon Sep 17 00:00:00 2001 From: vms Date: Mon, 22 Feb 2021 19:00:29 +0300 Subject: [PATCH 07/19] rename reexport --- src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2a113b4..d74b8c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,10 +79,8 @@ pub use fluence_sdk_main::WasmLoggerBuilder; #[cfg(feature = "logger")] pub use fluence_sdk_main::TargetMap; -pub mod mounted_binary { - pub use fluence_sdk_main::mounted_binary::Result; - pub use fluence_sdk_main::mounted_binary::SUCCESS_CODE; -} +pub use fluence_sdk_main::mounted_binary::Result as MountedBinaryResult; +pub use fluence_sdk_main::mounted_binary::SUCCESS_CODE as BINARY_SUCCESS_CODE; /// These API functions are intended for internal usage in generated code. /// Normally, you shouldn't use them. From 292bdc73ead48644705c9feea9c3948e44621c66 Mon Sep 17 00:00:00 2001 From: vms Date: Wed, 24 Feb 2021 08:31:56 +0300 Subject: [PATCH 08/19] add into_std --- crates/main/src/mounted_binary.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index a6480e3..dc635bb 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -48,4 +48,16 @@ impl Result { stderr: Vec::new(), } } + + /// This function checks ret_code and returns either Ok if it was SUCCESS_CODE or Err otherwise. + /// + /// SAFETY: + /// The function relies on both stdout and stderr to contain valid UTF8 string. + unsafe fn into_std(self) -> std::result::Result { + if self.ret_code == SUCCESS_CODE { + Ok(String::from_utf8_unchecked(self.stdout)) + } else { + Err(String::from_utf8_unchecked(self.stderr)) + } + } } From 06f686fc6288847815da4a7cc721754dc80329a8 Mon Sep 17 00:00:00 2001 From: vms Date: Wed, 24 Feb 2021 08:51:29 +0300 Subject: [PATCH 09/19] bump versions --- Cargo.toml | 6 +++--- crates/macro/Cargo.toml | 4 ++-- crates/macro/src/lib.rs | 2 +- crates/main/Cargo.toml | 4 ++-- crates/main/src/lib.rs | 2 +- crates/main/src/mounted_binary.rs | 2 +- crates/wit/Cargo.toml | 2 +- crates/wit/src/lib.rs | 2 +- src/lib.rs | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2a71973..974d37b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.2.18" # remember to update html_root_url +version = "0.3.0" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.2.18" } -fluence-sdk-main = { path = "crates/main", version = "=0.2.18" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.3.0" } +fluence-sdk-main = { path = "crates/main", version = "=0.3.0" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index 39426dc..0ee5096 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.2.18" # remember to update html_root_url +version = "0.3.0" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.2.18" } +fluence-sdk-wit = { path = "../wit", version = "=0.3.0" } diff --git a/crates/macro/src/lib.rs b/crates/macro/src/lib.rs index 58f32ce..cf7f4d8 100644 --- a/crates/macro/src/lib.rs +++ b/crates/macro/src/lib.rs @@ -54,7 +54,7 @@ //! //! ``` -#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.2.18")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.3.0")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index af1c889..e33be48 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.2.18" # remember to update html_root_url +version = "0.3.0" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.2.18" } +fluence-sdk-macro = { path = "../macro", version = "=0.3.0" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index fc36a30..6968460 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -19,7 +19,7 @@ #![allow(clippy::missing_safety_doc)] #![allow(clippy::needless_doctest_main)] -#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.2.18")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.3.0")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index dc635bb..2b46661 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -53,7 +53,7 @@ impl Result { /// /// SAFETY: /// The function relies on both stdout and stderr to contain valid UTF8 string. - unsafe fn into_std(self) -> std::result::Result { + pub unsafe fn into_std(self) -> std::result::Result { if self.ret_code == SUCCESS_CODE { Ok(String::from_utf8_unchecked(self.stdout)) } else { diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index e20488b..6fac922 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.2.18" # remember to update html_root_url +version = "0.3.0" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" diff --git a/crates/wit/src/lib.rs b/crates/wit/src/lib.rs index 8d52ae6..8a77a19 100644 --- a/crates/wit/src/lib.rs +++ b/crates/wit/src/lib.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -#![doc(html_root_url = "https://docs.rs/wit-support/0.2.18")] +#![doc(html_root_url = "https://docs.rs/wit-support/0.3.0")] #![deny( dead_code, nonstandard_style, diff --git a/src/lib.rs b/src/lib.rs index d74b8c5..ff251cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,7 @@ //! pub fn curl_get(url: String) -> String; //! } //! ``` -#![doc(html_root_url = "https://docs.rs/fluence/0.2.18")] +#![doc(html_root_url = "https://docs.rs/fluence/0.3.0")] #![deny( dead_code, nonstandard_style, From fb4ffefab470a84d536a17ed38e098dab7e41f08 Mon Sep 17 00:00:00 2001 From: vms Date: Wed, 24 Feb 2021 11:22:21 +0300 Subject: [PATCH 10/19] review fixes --- crates/main/src/mounted_binary.rs | 35 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index 2b46661..527a2b2 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -49,15 +49,36 @@ impl Result { } } - /// This function checks ret_code and returns either Ok if it was SUCCESS_CODE or Err otherwise. - /// - /// SAFETY: - /// The function relies on both stdout and stderr to contain valid UTF8 string. - pub unsafe fn into_std(self) -> std::result::Result { + /// Return true, if this Result represents a success result, otherwise false. + pub fn is_success(&self) -> bool { + return self.ret_code == SUCCESS_CODE; + } + + /// This function tries to transform a result to the string representation. + /// Internally, It checks ret_code and returns either Some(Ok(stdout)) if it was SUCCESS_CODE + /// or Some(Err(error)) otherwise. None is returned if stdout or stderr contains non valid + /// UTF8 string. + pub fn into_std(self) -> Option> { if self.ret_code == SUCCESS_CODE { - Ok(String::from_utf8_unchecked(self.stdout)) + let stdout = String::from_utf8(self.stdout).ok()?; + Some(Ok(stdout)) } else { - Err(String::from_utf8_unchecked(self.stderr)) + let stderr = std::str::from_utf8(&self.stdout).ok()?; + Some(Ok(format!("error: {}, stderr: {}", self.error, stderr))) + } + } + + /// This function tries to represent a result to the string representation. + /// Internally, It checks ret_code and returns either Some(Ok(stdout)) if it was SUCCESS_CODE + /// or Some(Err(error)) otherwise. None is returned if stdout or stderr contains non valid + /// UTF8 string. + pub fn as_std(&self) -> Option> { + if self.ret_code == SUCCESS_CODE { + let stdout = String::from_utf8(self.stdout.clone()).ok()?; + Some(Ok(stdout)) + } else { + let stderr = std::str::from_utf8(&self.stdout).ok()?; + Some(Ok(format!("error: {}, stderr: {}", self.error, stderr))) } } } From 008470a757d6bab50fa52c64473a8cd65f140361 Mon Sep 17 00:00:00 2001 From: vms Date: Wed, 24 Feb 2021 11:46:07 +0300 Subject: [PATCH 11/19] fix a typo --- crates/main/src/mounted_binary.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index 527a2b2..47ea4be 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -68,7 +68,7 @@ impl Result { } } - /// This function tries to represent a result to the string representation. + /// This function tries to represent a result as a string. /// Internally, It checks ret_code and returns either Some(Ok(stdout)) if it was SUCCESS_CODE /// or Some(Err(error)) otherwise. None is returned if stdout or stderr contains non valid /// UTF8 string. From 929a5f21d95abefeae3dbaabfbf6115d788de06c Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 25 Feb 2021 13:44:10 +0300 Subject: [PATCH 12/19] add filter logic --- crates/main/Cargo.toml | 1 + crates/main/src/logger.rs | 119 +++++++++++++++++++++++++----- crates/main/src/mounted_binary.rs | 2 +- 3 files changed, 102 insertions(+), 20 deletions(-) diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index e33be48..892f12e 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -26,6 +26,7 @@ serde = "=1.0.118" [dev-dependencies] simple_logger = "1.6.0" # used in doc test lazy_static = "1.4.0" # used in doc test +maplit = "1.0.2" [features] # Print some internal logs by log_utf8_string diff --git a/crates/main/src/logger.rs b/crates/main/src/logger.rs index 58bf059..e462711 100644 --- a/crates/main/src/logger.rs +++ b/crates/main/src/logger.rs @@ -43,9 +43,10 @@ //! [`log`]: https://docs.rs/log use log::Level as LogLevel; +use std::collections::HashMap; /// By default, logger will be initialized with log level from this environment variable. -pub const WASM_LOG_ENV_NAME: &'static str = "WASM_LOG"; +pub const WASM_LOG_ENV_NAME: &str = "WASM_LOG"; /// If WASM_LOG_ENV isn't set, then this level will be used as the default. const WASM_DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Info; @@ -54,7 +55,10 @@ const WASM_DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Info; /// TODO: use i64 for bitmask when wasmpack/bindgen issue with i64 is fixed. /// Currently, i64 doesn't work on some versions of V8 because log_utf8_string function /// isn't marked as #[wasm_bindgen]. In result, TS/JS code throws 'TypeError' on every log. -pub type TargetMap = std::collections::HashMap<&'static str, i32>; +pub type TargetMap = HashMap<&'static str, i32>; + +/// Mapping from module name to their log levels. +type ModuleMap = HashMap; /// The Wasm Logger. /// @@ -68,14 +72,15 @@ pub type TargetMap = std::collections::HashMap<&'static str, i32>; /// [`Log`]: https://docs.rs/log/0.4.11/log/trait.Log.html struct WasmLogger { target_map: TargetMap, + modules_level: ModuleMap, + default_log_level: log::Level, } /// The Wasm logger builder. /// /// Build logger for the Fluence network, allows specifying target map and log level while building. pub struct WasmLoggerBuilder { - target_map: TargetMap, - log_level: log::Level, + wasm_logger: WasmLogger, } impl WasmLoggerBuilder { @@ -85,27 +90,37 @@ impl WasmLoggerBuilder { pub fn new() -> Self { use std::str::FromStr; - let log_level = std::env::var(WASM_LOG_ENV_NAME) + let default_log_level = std::env::var(WASM_LOG_ENV_NAME) .map_or(WASM_DEFAULT_LOG_LEVEL, |log_level_str| { LogLevel::from_str(&log_level_str).unwrap_or(WASM_DEFAULT_LOG_LEVEL) }); - Self { - log_level, - target_map: <_>::default(), - } + let wasm_logger = WasmLogger { + target_map: HashMap::new(), + modules_level: HashMap::new(), + default_log_level, + }; + + Self { wasm_logger } } /// Set the log level. pub fn with_log_level(mut self, level: log::Level) -> Self { - self.log_level = level; + self.wasm_logger.default_log_level = level; self } /// Set mapping between logging targets and numbers. /// Used to efficiently enable & disable logs per target on the host. pub fn with_target_map(mut self, map: TargetMap) -> Self { - self.target_map = map; + self.wasm_logger.target_map = map; + self + } + + pub fn filter(mut self, module_name: impl Into, level: log::Level) -> Self { + self.wasm_logger + .modules_level + .insert(module_name.into(), level); self } @@ -127,15 +142,9 @@ impl WasmLoggerBuilder { /// # } /// ``` pub fn build(self) -> Result<(), log::SetLoggerError> { - let Self { - log_level, - target_map, - } = self; - - let wasm_logger = WasmLogger { target_map }; + let Self { wasm_logger } = self; log::set_boxed_logger(Box::new(wasm_logger))?; - log::set_max_level(log_level.to_level_filter()); Ok(()) } } @@ -143,7 +152,12 @@ impl WasmLoggerBuilder { impl log::Log for WasmLogger { #[inline] fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { - metadata.level() <= log::max_level() + let allowed_level = match self.modules_level.get(metadata.target()) { + Some(allowed_level) => allowed_level, + None => &self.default_log_level, + }; + + metadata.level() <= *allowed_level } #[inline] @@ -204,3 +218,70 @@ fn level_from_i32(level: i32) -> log::Level { _ => log::Level::max(), } } + +#[cfg(test)] +mod tests { + use super::WasmLogger; + use log::Log; + + use std::collections::HashMap; + + fn create_metadata(module_name: &str, level: log::Level) -> log::Metadata<'_> { + log::MetadataBuilder::new() + .level(level) + .target(module_name) + .build() + } + + #[test] + fn enabled_by_module_name() { + let module_1_name = "module_1"; + let module_2_name = "module_2"; + + let modules_level = maplit::hashmap!( + module_1_name.to_string() => log::Level::Info, + module_2_name.to_string() => log::Level::Warn, + ); + + let logger = WasmLogger { + target_map: HashMap::new(), + modules_level, + default_log_level: log::Level::Error, + }; + + let allowed_metadata = create_metadata(module_1_name, log::Level::Info); + assert!(logger.enabled(&allowed_metadata)); + + let allowed_metadata = create_metadata(module_1_name, log::Level::Warn); + assert!(logger.enabled(&allowed_metadata)); + + let allowed_metadata = create_metadata(module_2_name, log::Level::Warn); + assert!(logger.enabled(&allowed_metadata)); + + let not_allowed_metadata = create_metadata(module_1_name, log::Level::Debug); + assert!(!logger.enabled(¬_allowed_metadata)); + + let not_allowed_metadata = create_metadata(module_2_name, log::Level::Info); + assert!(!logger.enabled(¬_allowed_metadata)); + } + + #[test] + fn default_log_level() { + let modules_level = maplit::hashmap!( + "module_1".to_string() => log::Level::Info, + ); + + let logger = WasmLogger { + target_map: HashMap::new(), + modules_level, + default_log_level: log::Level::Warn, + }; + + let module_name = "some_module"; + let allowed_metadata = create_metadata(module_name, log::Level::Warn); + assert!(logger.enabled(&allowed_metadata)); + + let not_allowed_metadata = create_metadata(module_name, log::Level::Info); + assert!(!logger.enabled(¬_allowed_metadata)); + } +} diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index 47ea4be..e016189 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -51,7 +51,7 @@ impl Result { /// Return true, if this Result represents a success result, otherwise false. pub fn is_success(&self) -> bool { - return self.ret_code == SUCCESS_CODE; + self.ret_code == SUCCESS_CODE } /// This function tries to transform a result to the string representation. From 25b9fd0ef0bd0bae6cf24c76f85c060b8f078273 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 25 Feb 2021 13:46:02 +0300 Subject: [PATCH 13/19] bump versions --- Cargo.toml | 6 +++--- crates/macro/Cargo.toml | 4 ++-- crates/macro/src/lib.rs | 2 +- crates/main/Cargo.toml | 4 ++-- crates/main/src/lib.rs | 2 +- crates/wit/Cargo.toml | 2 +- crates/wit/src/lib.rs | 2 +- src/lib.rs | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 974d37b..692d8a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.3.0" # remember to update html_root_url +version = "0.3.1" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.3.0" } -fluence-sdk-main = { path = "crates/main", version = "=0.3.0" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.3.1" } +fluence-sdk-main = { path = "crates/main", version = "=0.3.1" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index 0ee5096..ddd4437 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.3.0" # remember to update html_root_url +version = "0.3.1" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.3.0" } +fluence-sdk-wit = { path = "../wit", version = "=0.3.1" } diff --git a/crates/macro/src/lib.rs b/crates/macro/src/lib.rs index cf7f4d8..f8310fb 100644 --- a/crates/macro/src/lib.rs +++ b/crates/macro/src/lib.rs @@ -54,7 +54,7 @@ //! //! ``` -#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.3.0")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.3.1")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index 892f12e..a7d75b5 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.3.0" # remember to update html_root_url +version = "0.3.1" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.3.0" } +fluence-sdk-macro = { path = "../macro", version = "=0.3.1" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index 6968460..70ee98b 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -19,7 +19,7 @@ #![allow(clippy::missing_safety_doc)] #![allow(clippy::needless_doctest_main)] -#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.3.0")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.3.1")] #![deny( dead_code, nonstandard_style, diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index 6fac922..a3d2204 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.3.0" # remember to update html_root_url +version = "0.3.1" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" diff --git a/crates/wit/src/lib.rs b/crates/wit/src/lib.rs index 8a77a19..72a4d8d 100644 --- a/crates/wit/src/lib.rs +++ b/crates/wit/src/lib.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -#![doc(html_root_url = "https://docs.rs/wit-support/0.3.0")] +#![doc(html_root_url = "https://docs.rs/wit-support/0.3.1")] #![deny( dead_code, nonstandard_style, diff --git a/src/lib.rs b/src/lib.rs index ff251cb..ecdd38a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,7 @@ //! pub fn curl_get(url: String) -> String; //! } //! ``` -#![doc(html_root_url = "https://docs.rs/fluence/0.3.0")] +#![doc(html_root_url = "https://docs.rs/fluence/0.3.1")] #![deny( dead_code, nonstandard_style, From 40a308946e2ac1686efd3bee256c9f51c79e42a0 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 25 Feb 2021 22:56:25 +0300 Subject: [PATCH 14/19] introduce stringify --- crates/main/src/mounted_binary.rs | 33 ++++++++++++++++++++++++++++++- src/lib.rs | 1 + 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index e016189..2bc372c 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -38,6 +38,23 @@ pub struct Result { pub stderr: Vec, } +/// The same as the Result, but stdout and stderr are utf8 strings. +#[fce] +#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] +pub struct StringResult { + /// Return process exit code or host execution error code, where SUCCESS_CODE means success. + pub ret_code: i32, + + /// Contains the string representation of an error, if ret_code != SUCCESS_CODE. + pub error: String, + + /// The data that the process wrote to stdout. + pub stdout: String, + + /// The data that the process wrote to stderr. + pub stderr: String, +} + impl Result { /// Create a new failure MountedBinaryResult from the provided ret_code. pub fn from_error(ret_code: i32, error: impl Into) -> Self { @@ -63,7 +80,7 @@ impl Result { let stdout = String::from_utf8(self.stdout).ok()?; Some(Ok(stdout)) } else { - let stderr = std::str::from_utf8(&self.stdout).ok()?; + let stderr = std::str::from_utf8(&self.stderr).ok()?; Some(Ok(format!("error: {}, stderr: {}", self.error, stderr))) } } @@ -81,4 +98,18 @@ impl Result { Some(Ok(format!("error: {}, stderr: {}", self.error, stderr))) } } + + pub fn stringify(&self) -> Option { + let stdout = String::from_utf8(self.stdout.clone()).ok()?; + let stderr = String::from_utf8(self.stderr.clone()).ok()?; + + let string_result = StringResult { + ret_code: self.ret_code, + error: self.error.clone(), + stdout, + stderr, + }; + + Some(string_result) + } } diff --git a/src/lib.rs b/src/lib.rs index ecdd38a..f43e818 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,6 +80,7 @@ pub use fluence_sdk_main::WasmLoggerBuilder; pub use fluence_sdk_main::TargetMap; pub use fluence_sdk_main::mounted_binary::Result as MountedBinaryResult; +pub use fluence_sdk_main::mounted_binary::StringResult as MountedBinaryStringResult; pub use fluence_sdk_main::mounted_binary::SUCCESS_CODE as BINARY_SUCCESS_CODE; /// These API functions are intended for internal usage in generated code. From db580be7db6e6e4d9d8451797b7b1d847682dee5 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 25 Feb 2021 23:00:15 +0300 Subject: [PATCH 15/19] fix as_std --- Cargo.toml | 6 +++--- crates/macro/Cargo.toml | 4 ++-- crates/main/Cargo.toml | 4 ++-- crates/main/src/mounted_binary.rs | 2 +- crates/wit/Cargo.toml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 692d8a9..60d5690 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.3.1" # remember to update html_root_url +version = "0.3.3" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.3.1" } -fluence-sdk-main = { path = "crates/main", version = "=0.3.1" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.3.3" } +fluence-sdk-main = { path = "crates/main", version = "=0.3.3" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index ddd4437..3d0b3d0 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.3.1" # remember to update html_root_url +version = "0.3.3" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.3.1" } +fluence-sdk-wit = { path = "../wit", version = "=0.3.3" } diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index a7d75b5..64d0281 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.3.1" # remember to update html_root_url +version = "0.3.3" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.3.1" } +fluence-sdk-macro = { path = "../macro", version = "=0.3.3" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/main/src/mounted_binary.rs b/crates/main/src/mounted_binary.rs index 2bc372c..8fbe3d3 100644 --- a/crates/main/src/mounted_binary.rs +++ b/crates/main/src/mounted_binary.rs @@ -94,7 +94,7 @@ impl Result { let stdout = String::from_utf8(self.stdout.clone()).ok()?; Some(Ok(stdout)) } else { - let stderr = std::str::from_utf8(&self.stdout).ok()?; + let stderr = std::str::from_utf8(&self.stderr).ok()?; Some(Ok(format!("error: {}, stderr: {}", self.error, stderr))) } } diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index a3d2204..a38f04b 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.3.1" # remember to update html_root_url +version = "0.3.3" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" From 4bdb18fad5f8388463b50381a378bc9858ba9171 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 26 Feb 2021 12:24:10 +0300 Subject: [PATCH 16/19] setting_max_level --- crates/main/src/logger.rs | 51 +++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/crates/main/src/logger.rs b/crates/main/src/logger.rs index e462711..3977ef4 100644 --- a/crates/main/src/logger.rs +++ b/crates/main/src/logger.rs @@ -23,12 +23,12 @@ //! Macros from crate [`log`] are used as a logging facade. //! //! ``` -//! use fluence::sdk::*; +//! use fluence::logger; //! use log::{error, trace}; //! use simple_logger; //! //! fn main() { -//! logger::WasmLogger::new() +//! logger::WasmLoggerBuilder::new() //! .with_log_leve(log::Level::Info) //! .build() //! .unwrap(); @@ -42,14 +42,14 @@ //! [`WasmLogger`]: struct.WasmLogger.html //! [`log`]: https://docs.rs/log -use log::Level as LogLevel; +use log::LevelFilter; use std::collections::HashMap; /// By default, logger will be initialized with log level from this environment variable. pub const WASM_LOG_ENV_NAME: &str = "WASM_LOG"; /// If WASM_LOG_ENV isn't set, then this level will be used as the default. -const WASM_DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Info; +const WASM_DEFAULT_LOG_LEVEL: LevelFilter = LevelFilter::Info; /// Mapping from logging namespace string to its bitmask. /// TODO: use i64 for bitmask when wasmpack/bindgen issue with i64 is fixed. @@ -58,7 +58,7 @@ const WASM_DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Info; pub type TargetMap = HashMap<&'static str, i32>; /// Mapping from module name to their log levels. -type ModuleMap = HashMap; +type ModuleMap = HashMap; /// The Wasm Logger. /// @@ -73,7 +73,7 @@ type ModuleMap = HashMap; struct WasmLogger { target_map: TargetMap, modules_level: ModuleMap, - default_log_level: log::Level, + default_log_level: LevelFilter, } /// The Wasm logger builder. @@ -92,7 +92,7 @@ impl WasmLoggerBuilder { let default_log_level = std::env::var(WASM_LOG_ENV_NAME) .map_or(WASM_DEFAULT_LOG_LEVEL, |log_level_str| { - LogLevel::from_str(&log_level_str).unwrap_or(WASM_DEFAULT_LOG_LEVEL) + LevelFilter::from_str(&log_level_str).unwrap_or(WASM_DEFAULT_LOG_LEVEL) }); let wasm_logger = WasmLogger { @@ -105,7 +105,7 @@ impl WasmLoggerBuilder { } /// Set the log level. - pub fn with_log_level(mut self, level: log::Level) -> Self { + pub fn with_log_level(mut self, level: LevelFilter) -> Self { self.wasm_logger.default_log_level = level; self } @@ -117,7 +117,7 @@ impl WasmLoggerBuilder { self } - pub fn filter(mut self, module_name: impl Into, level: log::Level) -> Self { + pub fn filter(mut self, module_name: impl Into, level: LevelFilter) -> Self { self.wasm_logger .modules_level .insert(module_name.into(), level); @@ -134,24 +134,42 @@ impl WasmLoggerBuilder { /// # use log::info; /// # /// # fn main() { - /// logger::WasmLogger::new() - /// .with_log_level(log::Level::Trace) + /// logger::WasmLoggerBuilder::new() + /// .with_log_level(log::LevelFilter::Trace) /// .with_target_map(<_>::default()) /// .build() /// .unwrap(); /// # } /// ``` pub fn build(self) -> Result<(), log::SetLoggerError> { + let max_level = self.max_log_level(); + let Self { wasm_logger } = self; log::set_boxed_logger(Box::new(wasm_logger))?; + log::set_max_level(max_level); Ok(()) } + + fn max_log_level(&self) -> log::LevelFilter { + let default_level = self.wasm_logger.default_log_level; + let max_filter_level = self + .wasm_logger + .modules_level + .iter() + .map(|(_, &level)| level) + .max() + .unwrap_or(LevelFilter::Off); + + std::cmp::max(default_level, max_filter_level) + } } impl log::Log for WasmLogger { #[inline] fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { + println!("enabled is called with {:?}", metadata); + let allowed_level = match self.modules_level.get(metadata.target()) { Some(allowed_level) => allowed_level, None => &self.default_log_level, @@ -222,6 +240,7 @@ fn level_from_i32(level: i32) -> log::Level { #[cfg(test)] mod tests { use super::WasmLogger; + use log::LevelFilter; use log::Log; use std::collections::HashMap; @@ -239,14 +258,14 @@ mod tests { let module_2_name = "module_2"; let modules_level = maplit::hashmap!( - module_1_name.to_string() => log::Level::Info, - module_2_name.to_string() => log::Level::Warn, + module_1_name.to_string() => LevelFilter::Info, + module_2_name.to_string() => LevelFilter::Warn, ); let logger = WasmLogger { target_map: HashMap::new(), modules_level, - default_log_level: log::Level::Error, + default_log_level: LevelFilter::Error, }; let allowed_metadata = create_metadata(module_1_name, log::Level::Info); @@ -268,13 +287,13 @@ mod tests { #[test] fn default_log_level() { let modules_level = maplit::hashmap!( - "module_1".to_string() => log::Level::Info, + "module_1".to_string() => LevelFilter::Info, ); let logger = WasmLogger { target_map: HashMap::new(), modules_level, - default_log_level: log::Level::Warn, + default_log_level: LevelFilter::Warn, }; let module_name = "some_module"; From d7d17e19ee44f13909b72280ccc9808d0041de48 Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 26 Feb 2021 12:29:18 +0300 Subject: [PATCH 17/19] bump versions --- Cargo.toml | 6 +++--- crates/macro/Cargo.toml | 4 ++-- crates/main/Cargo.toml | 4 ++-- crates/wit/Cargo.toml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 60d5690..151ca76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.3.3" # remember to update html_root_url +version = "0.4.0" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.3.3" } -fluence-sdk-main = { path = "crates/main", version = "=0.3.3" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.4.0" } +fluence-sdk-main = { path = "crates/main", version = "=0.4.0" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index 3d0b3d0..4d651ea 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.3.3" # remember to update html_root_url +version = "0.4.0" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.3.3" } +fluence-sdk-wit = { path = "../wit", version = "=0.4.0" } diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index 64d0281..7e64791 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.3.3" # remember to update html_root_url +version = "0.4.0" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.3.3" } +fluence-sdk-macro = { path = "../macro", version = "=0.4.0" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index a38f04b..cb28aaf 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.3.3" # remember to update html_root_url +version = "0.4.0" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" From 4cf32913235c15b0330fc51b627235348b820d0b Mon Sep 17 00:00:00 2001 From: vms Date: Fri, 26 Feb 2021 12:56:25 +0300 Subject: [PATCH 18/19] bump version --- Cargo.toml | 6 +++--- crates/macro/Cargo.toml | 4 ++-- crates/macro/src/lib.rs | 2 +- crates/main/Cargo.toml | 4 ++-- crates/main/src/lib.rs | 2 +- crates/main/src/logger.rs | 2 -- crates/wit/Cargo.toml | 2 +- crates/wit/src/lib.rs | 2 +- src/lib.rs | 2 +- 9 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 151ca76..1414156 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.4.0" # remember to update html_root_url +version = "0.4.1" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.4.0" } -fluence-sdk-main = { path = "crates/main", version = "=0.4.0" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.4.1" } +fluence-sdk-main = { path = "crates/main", version = "=0.4.1" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index 4d651ea..c377085 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.4.0" # remember to update html_root_url +version = "0.4.1" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.4.0" } +fluence-sdk-wit = { path = "../wit", version = "=0.4.1" } diff --git a/crates/macro/src/lib.rs b/crates/macro/src/lib.rs index f8310fb..f0981a8 100644 --- a/crates/macro/src/lib.rs +++ b/crates/macro/src/lib.rs @@ -54,7 +54,7 @@ //! //! ``` -#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.3.1")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.4.1")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index 7e64791..3e8f812 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.4.0" # remember to update html_root_url +version = "0.4.1" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.4.0" } +fluence-sdk-macro = { path = "../macro", version = "=0.4.1" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index 70ee98b..0ac8776 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -19,7 +19,7 @@ #![allow(clippy::missing_safety_doc)] #![allow(clippy::needless_doctest_main)] -#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.3.1")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.4.1")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/src/logger.rs b/crates/main/src/logger.rs index 3977ef4..6393ecb 100644 --- a/crates/main/src/logger.rs +++ b/crates/main/src/logger.rs @@ -168,8 +168,6 @@ impl WasmLoggerBuilder { impl log::Log for WasmLogger { #[inline] fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { - println!("enabled is called with {:?}", metadata); - let allowed_level = match self.modules_level.get(metadata.target()) { Some(allowed_level) => allowed_level, None => &self.default_log_level, diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index cb28aaf..f935c80 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.4.0" # remember to update html_root_url +version = "0.4.1" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" diff --git a/crates/wit/src/lib.rs b/crates/wit/src/lib.rs index 72a4d8d..cd8745b 100644 --- a/crates/wit/src/lib.rs +++ b/crates/wit/src/lib.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -#![doc(html_root_url = "https://docs.rs/wit-support/0.3.1")] +#![doc(html_root_url = "https://docs.rs/wit-support/0.4.1")] #![deny( dead_code, nonstandard_style, diff --git a/src/lib.rs b/src/lib.rs index f43e818..e77b058 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,7 @@ //! pub fn curl_get(url: String) -> String; //! } //! ``` -#![doc(html_root_url = "https://docs.rs/fluence/0.3.1")] +#![doc(html_root_url = "https://docs.rs/fluence/0.4.1")] #![deny( dead_code, nonstandard_style, From 947d2047fb4cb5ebc176675c67126efd03f2fc24 Mon Sep 17 00:00:00 2001 From: vms Date: Sun, 28 Feb 2021 19:02:30 +0300 Subject: [PATCH 19/19] use directives instead of map --- Cargo.toml | 6 +-- crates/macro/Cargo.toml | 4 +- crates/macro/src/lib.rs | 2 +- crates/main/Cargo.toml | 5 +- crates/main/src/lib.rs | 2 +- crates/main/src/logger.rs | 97 ++++++++++++++++++++++++++++----------- crates/wit/Cargo.toml | 2 +- crates/wit/src/lib.rs | 2 +- src/lib.rs | 2 +- 9 files changed, 83 insertions(+), 39 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1414156..a6d8d2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence" -version = "0.4.1" # remember to update html_root_url +version = "0.4.2" # remember to update html_root_url description = "Fluence backend SDK for developing backend applications for the Fluence network" documentation = "https://docs.rs/fluence/" repository = "https://github.com/fluencelabs/rust-sdk" @@ -18,8 +18,8 @@ all-features = true path = "src/lib.rs" [dependencies] -fluence-sdk-macro = { path = "crates/macro", version = "=0.4.1" } -fluence-sdk-main = { path = "crates/main", version = "=0.4.1" } +fluence-sdk-macro = { path = "crates/macro", version = "=0.4.2" } +fluence-sdk-main = { path = "crates/main", version = "=0.4.2" } [features] # Print some internal logs by log_utf8_string diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml index c377085..615b031 100644 --- a/crates/macro/Cargo.toml +++ b/crates/macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-macro" -version = "0.4.1" # remember to update html_root_url +version = "0.4.2" # remember to update html_root_url edition = "2018" description = "Definition of `#[invoke_handler]` attribute" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -17,4 +17,4 @@ all-features = true proc-macro = true [dependencies] -fluence-sdk-wit = { path = "../wit", version = "=0.4.1" } +fluence-sdk-wit = { path = "../wit", version = "=0.4.2" } diff --git a/crates/macro/src/lib.rs b/crates/macro/src/lib.rs index f0981a8..68e3075 100644 --- a/crates/macro/src/lib.rs +++ b/crates/macro/src/lib.rs @@ -54,7 +54,7 @@ //! //! ``` -#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.4.1")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.4.2")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index 3e8f812..10b00ef 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-main" -version = "0.4.1" # remember to update html_root_url +version = "0.4.2" # remember to update html_root_url edition = "2018" description = "Rust SDK for applications for the Fluence network" documentation = "https://docs.rs/fluence/fluence-sdk-macro" @@ -18,7 +18,7 @@ path = "src/lib.rs" crate-type = ["rlib"] [dependencies] -fluence-sdk-macro = { path = "../macro", version = "=0.4.1" } +fluence-sdk-macro = { path = "../macro", version = "=0.4.2" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" @@ -26,7 +26,6 @@ serde = "=1.0.118" [dev-dependencies] simple_logger = "1.6.0" # used in doc test lazy_static = "1.4.0" # used in doc test -maplit = "1.0.2" [features] # Print some internal logs by log_utf8_string diff --git a/crates/main/src/lib.rs b/crates/main/src/lib.rs index 0ac8776..41ce22e 100644 --- a/crates/main/src/lib.rs +++ b/crates/main/src/lib.rs @@ -19,7 +19,7 @@ #![allow(clippy::missing_safety_doc)] #![allow(clippy::needless_doctest_main)] -#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.4.1")] +#![doc(html_root_url = "https://docs.rs/fluence-sdk-main/0.4.2")] #![deny( dead_code, nonstandard_style, diff --git a/crates/main/src/logger.rs b/crates/main/src/logger.rs index 6393ecb..aaf5eec 100644 --- a/crates/main/src/logger.rs +++ b/crates/main/src/logger.rs @@ -22,7 +22,7 @@ //! This example initializes [`WasmLogger`] with setting log level. //! Macros from crate [`log`] are used as a logging facade. //! -//! ``` +//! ```ignore //! use fluence::logger; //! use log::{error, trace}; //! use simple_logger; @@ -57,8 +57,18 @@ const WASM_DEFAULT_LOG_LEVEL: LevelFilter = LevelFilter::Info; /// isn't marked as #[wasm_bindgen]. In result, TS/JS code throws 'TypeError' on every log. pub type TargetMap = HashMap<&'static str, i32>; -/// Mapping from module name to their log levels. -type ModuleMap = HashMap; +/// This structure is used to save information about particular log level for a particular module. +#[derive(Debug)] +struct LogDirective { + module_name: String, + level: LevelFilter, +} + +impl LogDirective { + pub fn new(module_name: String, level: LevelFilter) -> Self { + Self { module_name, level } + } +} /// The Wasm Logger. /// @@ -72,7 +82,7 @@ type ModuleMap = HashMap; /// [`Log`]: https://docs.rs/log/0.4.11/log/trait.Log.html struct WasmLogger { target_map: TargetMap, - modules_level: ModuleMap, + modules_directives: Vec, default_log_level: LevelFilter, } @@ -97,7 +107,7 @@ impl WasmLoggerBuilder { let wasm_logger = WasmLogger { target_map: HashMap::new(), - modules_level: HashMap::new(), + modules_directives: Vec::new(), default_log_level, }; @@ -118,9 +128,10 @@ impl WasmLoggerBuilder { } pub fn filter(mut self, module_name: impl Into, level: LevelFilter) -> Self { - self.wasm_logger - .modules_level - .insert(module_name.into(), level); + let module_name = module_name.into(); + let log_directive = LogDirective::new(module_name, level); + + self.wasm_logger.modules_directives.push(log_directive); self } @@ -129,7 +140,7 @@ impl WasmLoggerBuilder { /// This method is a last one in this builder chain and MUST be called to set logger up. /// Returns a error /// - /// ``` + /// ```ignore /// # use fluence::logger; /// # use log::info; /// # @@ -141,8 +152,9 @@ impl WasmLoggerBuilder { /// .unwrap(); /// # } /// ``` - pub fn build(self) -> Result<(), log::SetLoggerError> { + pub fn build(mut self) -> Result<(), log::SetLoggerError> { let max_level = self.max_log_level(); + self.sort_directives(); let Self { wasm_logger } = self; @@ -151,13 +163,23 @@ impl WasmLoggerBuilder { Ok(()) } + /// Sort supplied directive ny length of module names to make more efficient lookup at runtime. + fn sort_directives(&mut self) { + self.wasm_logger.modules_directives.sort_by(|l, r| { + let llen = l.module_name.len(); + let rlen = r.module_name.len(); + + rlen.cmp(&llen) + }); + } + fn max_log_level(&self) -> log::LevelFilter { let default_level = self.wasm_logger.default_log_level; let max_filter_level = self .wasm_logger - .modules_level + .modules_directives .iter() - .map(|(_, &level)| level) + .map(|d| d.level) .max() .unwrap_or(LevelFilter::Off); @@ -168,12 +190,15 @@ impl WasmLoggerBuilder { impl log::Log for WasmLogger { #[inline] fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { - let allowed_level = match self.modules_level.get(metadata.target()) { - Some(allowed_level) => allowed_level, - None => &self.default_log_level, - }; + let target = metadata.target(); - metadata.level() <= *allowed_level + for directive in self.modules_directives.iter() { + if target.starts_with(&directive.module_name) { + return metadata.level() <= directive.level; + } + } + + metadata.level() <= self.default_log_level } #[inline] @@ -238,6 +263,8 @@ fn level_from_i32(level: i32) -> log::Level { #[cfg(test)] mod tests { use super::WasmLogger; + use super::LogDirective; + use super::WasmLoggerBuilder; use log::LevelFilter; use log::Log; @@ -255,14 +282,14 @@ mod tests { let module_1_name = "module_1"; let module_2_name = "module_2"; - let modules_level = maplit::hashmap!( - module_1_name.to_string() => LevelFilter::Info, - module_2_name.to_string() => LevelFilter::Warn, - ); + let modules_directives = vec![ + LogDirective::new(module_1_name.to_string(), LevelFilter::Info), + LogDirective::new(module_2_name.to_string(), LevelFilter::Warn), + ]; let logger = WasmLogger { target_map: HashMap::new(), - modules_level, + modules_directives, default_log_level: LevelFilter::Error, }; @@ -284,13 +311,11 @@ mod tests { #[test] fn default_log_level() { - let modules_level = maplit::hashmap!( - "module_1".to_string() => LevelFilter::Info, - ); + let modules_directives = vec![LogDirective::new("module_1".to_string(), LevelFilter::Info)]; let logger = WasmLogger { target_map: HashMap::new(), - modules_level, + modules_directives, default_log_level: LevelFilter::Warn, }; @@ -301,4 +326,24 @@ mod tests { let not_allowed_metadata = create_metadata(module_name, log::Level::Info); assert!(!logger.enabled(¬_allowed_metadata)); } + + #[test] + fn longest_directive_first() { + let module_1_name = "module_1"; + let module_2_name = "module_1::some_name::func_name"; + + WasmLoggerBuilder::new() + .filter(module_1_name, LevelFilter::Info) + .filter(module_2_name, LevelFilter::Warn) + .build() + .unwrap(); + + let logger = log::logger(); + + let allowed_metadata = create_metadata(module_1_name, log::Level::Info); + assert!(logger.enabled(&allowed_metadata)); + + let not_allowed_metadata = create_metadata(module_2_name, log::Level::Info); + assert!(!logger.enabled(¬_allowed_metadata)); + } } diff --git a/crates/wit/Cargo.toml b/crates/wit/Cargo.toml index f935c80..9bef5a1 100644 --- a/crates/wit/Cargo.toml +++ b/crates/wit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fluence-sdk-wit" -version = "0.4.1" # remember to update html_root_url +version = "0.4.2" # remember to update html_root_url edition = "2018" description = "Webassembly interface-types generator" documentation = "https://docs.rs/fluence/fluence-sdk-macro" diff --git a/crates/wit/src/lib.rs b/crates/wit/src/lib.rs index cd8745b..22e193a 100644 --- a/crates/wit/src/lib.rs +++ b/crates/wit/src/lib.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -#![doc(html_root_url = "https://docs.rs/wit-support/0.4.1")] +#![doc(html_root_url = "https://docs.rs/wit-support/0.4.2")] #![deny( dead_code, nonstandard_style, diff --git a/src/lib.rs b/src/lib.rs index e77b058..6d5250b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,7 @@ //! pub fn curl_get(url: String) -> String; //! } //! ``` -#![doc(html_root_url = "https://docs.rs/fluence/0.4.1")] +#![doc(html_root_url = "https://docs.rs/fluence/0.4.2")] #![deny( dead_code, nonstandard_style,