use directives instead of map

This commit is contained in:
vms 2021-02-28 19:02:30 +03:00
parent 4cf3291323
commit 947d2047fb
9 changed files with 83 additions and 39 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "fluence" 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" description = "Fluence backend SDK for developing backend applications for the Fluence network"
documentation = "https://docs.rs/fluence/" documentation = "https://docs.rs/fluence/"
repository = "https://github.com/fluencelabs/rust-sdk" repository = "https://github.com/fluencelabs/rust-sdk"
@ -18,8 +18,8 @@ all-features = true
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [dependencies]
fluence-sdk-macro = { path = "crates/macro", version = "=0.4.1" } fluence-sdk-macro = { path = "crates/macro", version = "=0.4.2" }
fluence-sdk-main = { path = "crates/main", version = "=0.4.1" } fluence-sdk-main = { path = "crates/main", version = "=0.4.2" }
[features] [features]
# Print some internal logs by log_utf8_string # Print some internal logs by log_utf8_string

View File

@ -1,6 +1,6 @@
[package] [package]
name = "fluence-sdk-macro" 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" edition = "2018"
description = "Definition of `#[invoke_handler]` attribute" description = "Definition of `#[invoke_handler]` attribute"
documentation = "https://docs.rs/fluence/fluence-sdk-macro" documentation = "https://docs.rs/fluence/fluence-sdk-macro"
@ -17,4 +17,4 @@ all-features = true
proc-macro = true proc-macro = true
[dependencies] [dependencies]
fluence-sdk-wit = { path = "../wit", version = "=0.4.1" } fluence-sdk-wit = { path = "../wit", version = "=0.4.2" }

View File

@ -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( #![deny(
dead_code, dead_code,
nonstandard_style, nonstandard_style,

View File

@ -1,6 +1,6 @@
[package] [package]
name = "fluence-sdk-main" 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" edition = "2018"
description = "Rust SDK for applications for the Fluence network" description = "Rust SDK for applications for the Fluence network"
documentation = "https://docs.rs/fluence/fluence-sdk-macro" documentation = "https://docs.rs/fluence/fluence-sdk-macro"
@ -18,7 +18,7 @@ path = "src/lib.rs"
crate-type = ["rlib"] crate-type = ["rlib"]
[dependencies] [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"] } log = { version = "0.4.8", features = ["std"] }
serde = "=1.0.118" serde = "=1.0.118"
@ -26,7 +26,6 @@ serde = "=1.0.118"
[dev-dependencies] [dev-dependencies]
simple_logger = "1.6.0" # used in doc test simple_logger = "1.6.0" # used in doc test
lazy_static = "1.4.0" # used in doc test lazy_static = "1.4.0" # used in doc test
maplit = "1.0.2"
[features] [features]
# Print some internal logs by log_utf8_string # Print some internal logs by log_utf8_string

View File

@ -19,7 +19,7 @@
#![allow(clippy::missing_safety_doc)] #![allow(clippy::missing_safety_doc)]
#![allow(clippy::needless_doctest_main)] #![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( #![deny(
dead_code, dead_code,
nonstandard_style, nonstandard_style,

View File

@ -22,7 +22,7 @@
//! This example initializes [`WasmLogger`] with setting log level. //! This example initializes [`WasmLogger`] with setting log level.
//! Macros from crate [`log`] are used as a logging facade. //! Macros from crate [`log`] are used as a logging facade.
//! //!
//! ``` //! ```ignore
//! use fluence::logger; //! use fluence::logger;
//! use log::{error, trace}; //! use log::{error, trace};
//! use simple_logger; //! 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. /// isn't marked as #[wasm_bindgen]. In result, TS/JS code throws 'TypeError' on every log.
pub type TargetMap = HashMap<&'static str, i32>; pub type TargetMap = HashMap<&'static str, i32>;
/// Mapping from module name to their log levels. /// This structure is used to save information about particular log level for a particular module.
type ModuleMap = HashMap<String, LevelFilter>; #[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. /// The Wasm Logger.
/// ///
@ -72,7 +82,7 @@ type ModuleMap = HashMap<String, LevelFilter>;
/// [`Log`]: https://docs.rs/log/0.4.11/log/trait.Log.html /// [`Log`]: https://docs.rs/log/0.4.11/log/trait.Log.html
struct WasmLogger { struct WasmLogger {
target_map: TargetMap, target_map: TargetMap,
modules_level: ModuleMap, modules_directives: Vec<LogDirective>,
default_log_level: LevelFilter, default_log_level: LevelFilter,
} }
@ -97,7 +107,7 @@ impl WasmLoggerBuilder {
let wasm_logger = WasmLogger { let wasm_logger = WasmLogger {
target_map: HashMap::new(), target_map: HashMap::new(),
modules_level: HashMap::new(), modules_directives: Vec::new(),
default_log_level, default_log_level,
}; };
@ -118,9 +128,10 @@ impl WasmLoggerBuilder {
} }
pub fn filter(mut self, module_name: impl Into<String>, level: LevelFilter) -> Self { pub fn filter(mut self, module_name: impl Into<String>, level: LevelFilter) -> Self {
self.wasm_logger let module_name = module_name.into();
.modules_level let log_directive = LogDirective::new(module_name, level);
.insert(module_name.into(), level);
self.wasm_logger.modules_directives.push(log_directive);
self 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. /// This method is a last one in this builder chain and MUST be called to set logger up.
/// Returns a error /// Returns a error
/// ///
/// ``` /// ```ignore
/// # use fluence::logger; /// # use fluence::logger;
/// # use log::info; /// # use log::info;
/// # /// #
@ -141,8 +152,9 @@ impl WasmLoggerBuilder {
/// .unwrap(); /// .unwrap();
/// # } /// # }
/// ``` /// ```
pub fn build(self) -> Result<(), log::SetLoggerError> { pub fn build(mut self) -> Result<(), log::SetLoggerError> {
let max_level = self.max_log_level(); let max_level = self.max_log_level();
self.sort_directives();
let Self { wasm_logger } = self; let Self { wasm_logger } = self;
@ -151,13 +163,23 @@ impl WasmLoggerBuilder {
Ok(()) 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 { fn max_log_level(&self) -> log::LevelFilter {
let default_level = self.wasm_logger.default_log_level; let default_level = self.wasm_logger.default_log_level;
let max_filter_level = self let max_filter_level = self
.wasm_logger .wasm_logger
.modules_level .modules_directives
.iter() .iter()
.map(|(_, &level)| level) .map(|d| d.level)
.max() .max()
.unwrap_or(LevelFilter::Off); .unwrap_or(LevelFilter::Off);
@ -168,12 +190,15 @@ impl WasmLoggerBuilder {
impl log::Log for WasmLogger { impl log::Log for WasmLogger {
#[inline] #[inline]
fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { fn enabled(&self, metadata: &log::Metadata<'_>) -> bool {
let allowed_level = match self.modules_level.get(metadata.target()) { let target = metadata.target();
Some(allowed_level) => allowed_level,
None => &self.default_log_level,
};
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] #[inline]
@ -238,6 +263,8 @@ fn level_from_i32(level: i32) -> log::Level {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::WasmLogger; use super::WasmLogger;
use super::LogDirective;
use super::WasmLoggerBuilder;
use log::LevelFilter; use log::LevelFilter;
use log::Log; use log::Log;
@ -255,14 +282,14 @@ mod tests {
let module_1_name = "module_1"; let module_1_name = "module_1";
let module_2_name = "module_2"; let module_2_name = "module_2";
let modules_level = maplit::hashmap!( let modules_directives = vec![
module_1_name.to_string() => LevelFilter::Info, LogDirective::new(module_1_name.to_string(), LevelFilter::Info),
module_2_name.to_string() => LevelFilter::Warn, LogDirective::new(module_2_name.to_string(), LevelFilter::Warn),
); ];
let logger = WasmLogger { let logger = WasmLogger {
target_map: HashMap::new(), target_map: HashMap::new(),
modules_level, modules_directives,
default_log_level: LevelFilter::Error, default_log_level: LevelFilter::Error,
}; };
@ -284,13 +311,11 @@ mod tests {
#[test] #[test]
fn default_log_level() { fn default_log_level() {
let modules_level = maplit::hashmap!( let modules_directives = vec![LogDirective::new("module_1".to_string(), LevelFilter::Info)];
"module_1".to_string() => LevelFilter::Info,
);
let logger = WasmLogger { let logger = WasmLogger {
target_map: HashMap::new(), target_map: HashMap::new(),
modules_level, modules_directives,
default_log_level: LevelFilter::Warn, default_log_level: LevelFilter::Warn,
}; };
@ -301,4 +326,24 @@ mod tests {
let not_allowed_metadata = create_metadata(module_name, log::Level::Info); let not_allowed_metadata = create_metadata(module_name, log::Level::Info);
assert!(!logger.enabled(&not_allowed_metadata)); assert!(!logger.enabled(&not_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(&not_allowed_metadata));
}
} }

View File

@ -1,6 +1,6 @@
[package] [package]
name = "fluence-sdk-wit" 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" edition = "2018"
description = "Webassembly interface-types generator" description = "Webassembly interface-types generator"
documentation = "https://docs.rs/fluence/fluence-sdk-macro" documentation = "https://docs.rs/fluence/fluence-sdk-macro"

View File

@ -14,7 +14,7 @@
* limitations under the License. * 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( #![deny(
dead_code, dead_code,
nonstandard_style, nonstandard_style,

View File

@ -55,7 +55,7 @@
//! pub fn curl_get(url: String) -> String; //! 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( #![deny(
dead_code, dead_code,
nonstandard_style, nonstandard_style,