From 947d2047fb4cb5ebc176675c67126efd03f2fc24 Mon Sep 17 00:00:00 2001 From: vms Date: Sun, 28 Feb 2021 19:02:30 +0300 Subject: [PATCH] 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,