diff --git a/Cargo.lock b/Cargo.lock index edb9b21..ab69042 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,6 +193,9 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", + "tracing", + "tracing-subscriber", + "tracing-wasm", "wasm-bindgen", ] @@ -658,6 +661,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -758,6 +771,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1092,6 +1111,15 @@ dependencies = [ "serde", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "slab" version = "0.4.8" @@ -1167,6 +1195,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1262,9 +1300,21 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "tracing-core" version = "0.1.30" @@ -1272,6 +1322,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", ] [[package]] @@ -1324,6 +1411,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index ab9860e..a4cb175 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,9 @@ wasm-bindgen = { version = "^0.2", optional = true} pyo3 = { version = "^0.18", features = ["extension-module"], optional = true} pyo3-built = { version = "^0.4", optional = true} num_enum = "0.6.0" +tracing-wasm = "0.2.1" +tracing = "0.1.37" +tracing-subscriber = "0.3.17" [lib] diff --git a/src/lib.rs b/src/lib.rs index ad86c5e..8b397c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,10 @@ #![allow(dead_code)] #![allow(unused_imports)] -use logging::LogLevel; pub mod abilities; pub mod activity; pub mod d2_enums; pub mod enemies; -pub mod logging; pub mod perks; #[cfg(test)] mod test; @@ -21,7 +19,6 @@ use d2_enums::StatHashes; use enemies::Enemy; use std::cell::RefCell; use std::collections::HashMap; -use std::panic; mod built_info { include!(concat!(env!("OUT_DIR"), "/built.rs")); @@ -53,43 +50,53 @@ use crate::types::py_types::{ #[cfg(feature = "python")] use pyo3::{prelude::*, types::PyDict}; -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone)] pub struct PersistentData { pub weapon: Weapon, pub activity: Activity, pub ability: Ability, pub enemy: Enemy, - pub log_level: LogLevel, + pub log_level: tracing::Level, } + impl PersistentData { pub fn new() -> PersistentData { Self::default() } } -thread_local! { - static PERS_DATA: RefCell = RefCell::new(PersistentData::new()); +impl Default for PersistentData { + fn default() -> Self { + Self { + weapon: Default::default(), + activity: Default::default(), + ability: Default::default(), + enemy: Default::default(), + log_level: tracing::Level::INFO, + } + } } -#[cfg(feature = "wasm")] -#[wasm_bindgen] -extern "C" { - //foreign function interface - #[wasm_bindgen(js_namespace = console)] - pub fn log(s: &str); +thread_local! { + static PERS_DATA: RefCell = RefCell::new(PersistentData::new()); } -#[cfg(feature = "wasm")] -#[macro_export] -macro_rules! console_log { - ($($t:tt)*) => (crate::log(&format_args!($($t)*).to_string())) -} #[cfg(feature = "wasm")] #[wasm_bindgen(start)] pub fn start() { - panic::set_hook(Box::new(console_error_panic_hook::hook)); + use tracing_subscriber::{layer::SubscriberExt, Registry}; + use tracing_wasm::{WASMLayer, WASMLayerConfigBuilder}; + + console_error_panic_hook::set_once(); + let cfg = WASMLayerConfigBuilder::new() + .set_max_level(tracing::Level::WARN) + .build(); + let subscriber = Registry::default().with(WASMLayer::new(cfg)); + + tracing::subscriber::set_global_default(subscriber).expect("Unable to set global subscriber"); + + tracing::info!("D2 Calculator Loaded"); perks::map_perks(); - console_log!("D2 Calculator Loaded"); } //---------------WEAPONS---------------// @@ -139,11 +146,11 @@ pub fn set_weapon( _damage_type_id, ); if new_weapon.is_err() { - console_log!( - "Could not find weapon data for type: {}, intrinsic: {}, Err: {:?}", - _weapon_type_id, - _intrinsic_hash, - new_weapon + tracing::error!( + kind = ?_weapon_type_id, + intrinsic = ?_intrinsic_hash, + err = ?new_weapon, + "Could not find weapon data" ); perm_data.borrow_mut().weapon = Weapon::default(); } else { @@ -394,8 +401,21 @@ pub fn set_encounter( #[cfg(feature = "wasm")] #[wasm_bindgen(js_name = "setLoggingLevel")] pub fn set_logging_level(_level: usize) -> Result<(), JsValue> { + let level = match _level { + 0 => tracing::Level::TRACE, + 1 => tracing::Level::DEBUG, + 2 => tracing::Level::INFO, + 3 => tracing::Level::WARN, + 4 => tracing::Level::ERROR, + _ => { + return Err(JsValue::from_str( + "provided usize is too large; must be 4 or less.", + )) + } + }; + PERS_DATA.with(|perm_data| { - perm_data.borrow_mut().log_level = _level.into(); + perm_data.borrow_mut().log_level = level; }); Ok(()) } @@ -597,15 +617,11 @@ fn reverse_pve_calc( _combatant_mult: Option, _pve_mult: Option, ) -> PyResult { - use logging::extern_log; let output = PERS_DATA.with(|perm_data| { let combatant_mult = _combatant_mult.unwrap_or(1.0); let pve_mult = _pve_mult.unwrap_or(1.0); if perm_data.borrow().activity.name == "Default" { - extern_log( - "Activity is default and can return bad values", - LogLevel::Warning, - ) + tracing::warn!("Activity is default and can return bad values") } activity::damage_calc::remove_pve_bonuses( _damage, diff --git a/src/logging.rs b/src/logging.rs deleted file mode 100644 index f0ddcd3..0000000 --- a/src/logging.rs +++ /dev/null @@ -1,51 +0,0 @@ -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum LogLevel { - Error, - Warning, - Info, - Debug, -} -impl From for LogLevel { - fn from(i: usize) -> Self { - match i { - 0 => LogLevel::Error, - 1 => LogLevel::Warning, - 2 => LogLevel::Info, - 3 => LogLevel::Debug, - _ => panic!("Invalid log level"), - } - } -} -impl From for usize { - fn from(l: LogLevel) -> Self { - match l { - LogLevel::Error => 0, - LogLevel::Warning => 1, - LogLevel::Info => 2, - LogLevel::Debug => 3, - } - } -} -impl Default for LogLevel { - fn default() -> Self { - LogLevel::Warning - } -} - -fn get_log_level() -> LogLevel { - crate::PERS_DATA.with(|perm_data| perm_data.borrow().log_level) -} - -pub fn extern_log(s: &str, log_level: LogLevel) { - if log_level > get_log_level() { - return; - } - #[cfg(feature = "wasm")] - crate::console_log!("{}", s); - #[cfg(not(feature = "wasm"))] - println!("{}", s); -} - -pub fn log(s: &str, log_level: usize) { - extern_log(s, log_level.into()) -} diff --git a/src/perks/exotic_armor.rs b/src/perks/exotic_armor.rs index 2f4a175..edba7a7 100644 --- a/src/perks/exotic_armor.rs +++ b/src/perks/exotic_armor.rs @@ -1,9 +1,6 @@ use std::collections::HashMap; -use crate::{ - d2_enums::{AmmoType, BungieHash, DamageType, StatBump, StatHashes, WeaponType}, - logging::{extern_log, LogLevel}, -}; +use crate::d2_enums::{AmmoType, BungieHash, DamageType, StatBump, StatHashes, WeaponType}; use super::{ add_dmr, add_epr, add_flmr, add_fmr, add_hmr, add_mmr, add_rmr, add_rsmr, add_sbr, add_vmr, diff --git a/src/perks/year_1_perks.rs b/src/perks/year_1_perks.rs index 9ad8e10..4017151 100644 --- a/src/perks/year_1_perks.rs +++ b/src/perks/year_1_perks.rs @@ -1,9 +1,6 @@ use std::collections::HashMap; -use crate::{ - d2_enums::{AmmoType, BungieHash, DamageType, StatBump, StatHashes, WeaponType}, - logging::extern_log, -}; +use crate::d2_enums::{AmmoType, BungieHash, DamageType, StatBump, StatHashes, WeaponType}; use super::{ add_dmr, add_edr, add_epr, add_fmr, add_hmr, add_imr, add_mmr, add_rmr, add_rr, add_rsmr, diff --git a/src/weapons/ttk_calc.rs b/src/weapons/ttk_calc.rs index b3a25af..8464d9c 100644 --- a/src/weapons/ttk_calc.rs +++ b/src/weapons/ttk_calc.rs @@ -4,7 +4,6 @@ use serde::Serialize; use crate::{ d2_enums::WeaponType, - logging::extern_log, perks::{get_dmg_modifier, get_firing_modifier, lib::CalculationInput}, }; @@ -154,7 +153,7 @@ pub fn calc_ttk(_weapon: &Weapon, _overshield: f64) -> Vec { let ammo_fired; if _weapon.firing_data.one_ammo { - ammo_fired = opt_bullets_fired/shot_burst_size; + ammo_fired = opt_bullets_fired / shot_burst_size; } else { ammo_fired = opt_bullets_fired; } @@ -292,7 +291,7 @@ pub fn calc_ttk(_weapon: &Weapon, _overshield: f64) -> Vec { let ammo_fired; if _weapon.firing_data.one_ammo { - ammo_fired = opt_bullets_fired/shot_burst_size; + ammo_fired = opt_bullets_fired / shot_burst_size; } else { ammo_fired = opt_bullets_fired; }