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]
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

View File

@ -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" }

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(
dead_code,
nonstandard_style,

View File

@ -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

View File

@ -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,

View File

@ -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<String, LevelFilter>;
/// 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<String, LevelFilter>;
/// [`Log`]: https://docs.rs/log/0.4.11/log/trait.Log.html
struct WasmLogger {
target_map: TargetMap,
modules_level: ModuleMap,
modules_directives: Vec<LogDirective>,
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<String>, 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(&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]
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"

View File

@ -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,

View File

@ -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,