From ce4f57adea9987fc5cc362f30b070541b7c58ca1 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 05:53:01 +0100 Subject: [PATCH 1/7] Add datetime & declarative macros --- Cargo.toml | 1 + src/lib.rs | 118 +++++++++++++++++++++++++++++++++++++++++++++++----- src/main.rs | 15 ++++--- 3 files changed, 115 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 25ef259..e7adbe2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ categories = ["development-tools::debugging"] exclude = [".github/**"] [dependencies] +chrono = "0.4.19" embed-doc-image = "0.1.4" termcolor = "1.1.3" diff --git a/src/lib.rs b/src/lib.rs index 54964a4..2d0d7b9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,11 +50,12 @@ doc = ::embed_doc_image::embed_image!("unix_logs", "images/unix_logs.png")))] //! ### Author Notes //! //! I'm still incredibly early in my Rust journey and so I wanted to get comfortable and try to pick -//! my own brain about exposing different API's in a Rust crate. I hope to expose an intuitive and +//! my own brain about exposing different APIs in a Rust crate. I hope to expose an intuitive and //! easy to understand API design that users can instantly get started with. use std::fmt::{Display, Formatter}; use std::io::Write; + use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; /// TODO @@ -70,16 +71,114 @@ pub enum Level { impl Display for Level { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { - Level::TRACE => write!(f, "[TRACE]"), - Level::DEBUG => write!(f, "[DEBUG]"), - Level::INFO => write!(f, "[INFO]"), - Level::WARN => write!(f, "[WARN]"), - Level::ERROR => write!(f, "[ERROR]"), - Level::FATAL => write!(f, "[FATAL]"), + Level::TRACE => write!(f, "TRACE"), + Level::DEBUG => write!(f, "DEBUG"), + Level::INFO => write!(f, "INFO"), + Level::WARN => write!(f, "WARN"), + Level::ERROR => write!(f, "ERROR"), + Level::FATAL => write!(f, "FATAL"), } } } +#[macro_export] +macro_rules! trace { + ($str:expr) => {{ + use std::io::Write; + use termcolor::WriteColor; + + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color(termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Blue)) + .set_bold(true)) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, Level::TRACE, $str).unwrap(); + stream.reset().unwrap(); + }}; +} + +#[macro_export] +macro_rules! debug { + ($str:expr) => {{ + use std::io::Write; + use termcolor::WriteColor; + + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color(termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Green)) + .set_bold(true)) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, Level::DEBUG, $str).unwrap(); + stream.reset().unwrap(); + }}; +} + +#[macro_export] +macro_rules! info { + ($str:expr) => { + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + println!("{}", format!("[{} {}] {}", now, Level::INFO, $str)); + }; +} + +#[macro_export] +macro_rules! warn { + ($str:expr) => {{ + use std::io::Write; + use termcolor::WriteColor; + + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color(termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Yellow)) + .set_bold(true)) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, Level::WARN, $str).unwrap(); + stream.reset().unwrap(); + }}; +} + +#[macro_export] +macro_rules! error { + ($str:expr) => {{ + use std::io::Write; + use termcolor::WriteColor; + + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color(termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Red)) + .set_intense(true)) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, Level::ERROR, $str).unwrap(); + stream.reset().unwrap(); + }}; +} + +#[macro_export] +macro_rules! fatal { + ($str:expr) => {{ + use std::io::Write; + use termcolor::WriteColor; + + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color(termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Red)) + .set_bold(true)) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, Level::FATAL, $str).unwrap(); + stream.reset().unwrap(); + }}; +} + /// TODO pub struct SimpleLogger { standard_stream: StandardStream, @@ -118,10 +217,7 @@ impl SimpleLogger { .standard_stream .set_color(ColorSpec::new().set_fg(Some(Color::Green)).set_bold(true)) .unwrap(), - Level::INFO => self - .standard_stream - .set_color(ColorSpec::new().set_fg(None)) - .unwrap(), + Level::INFO => {} Level::WARN => self .standard_stream .set_color(ColorSpec::new().set_fg(Some(Color::Yellow)).set_bold(true)) diff --git a/src/main.rs b/src/main.rs index b0c5b39..28812d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,10 @@ -use rall::{Level, SimpleLogger}; +use rall::{debug, error, fatal, info, Level, SimpleLogger, trace, warn}; fn main() { - let mut logger = SimpleLogger::default(); - logger.log(Level::TRACE, "My Best Friend Hazel :D"); - logger.log(Level::DEBUG, "My Best Friend Hazel :D"); - logger.log(Level::INFO, "My Best Friend Hazel :D"); - logger.log(Level::WARN, "My Best Friend Hazel :D"); - logger.log(Level::ERROR, "My Best Friend Hazel :D"); - logger.log(Level::FATAL, "My Best Friend Hazel :D"); + trace!("My Best Friend Hazel :D"); + debug!("My Best Friend Hazel :D"); + info!("My Best Friend Hazel :D"); + warn!("My Best Friend Hazel :D"); + error!("My Best Friend Hazel :D"); + fatal!("My Best Friend Hazel :D"); } \ No newline at end of file From 36d3ecb3dfe2a9d20cf380c2d1378eae000fdbd0 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 06:01:06 +0100 Subject: [PATCH 2/7] Resolve 'use of undeclared type: Level' --- src/lib.rs | 71 ++++++----------------------------------------------- src/main.rs | 2 +- 2 files changed, 9 insertions(+), 64 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2d0d7b9..76f7223 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,8 +36,8 @@ //! #![cfg_attr(feature = "doc-images", cfg_attr(all(), -doc = ::embed_doc_image::embed_image!("windows_logs", "images/windows_logs.png"), -doc = ::embed_doc_image::embed_image!("unix_logs", "images/unix_logs.png")))] +doc =::embed_doc_image::embed_image ! ("windows_logs", "images/windows_logs.png"), +doc =::embed_doc_image::embed_image ! ("unix_logs", "images/unix_logs.png")))] //! //! ### Windows Output //! @@ -94,7 +94,7 @@ macro_rules! trace { .set_fg(Some(termcolor::Color::Blue)) .set_bold(true)) .unwrap(); - writeln!(&mut stream, "[{} {}] {}", now, Level::TRACE, $str).unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::TRACE, $str).unwrap(); stream.reset().unwrap(); }}; } @@ -112,7 +112,7 @@ macro_rules! debug { .set_fg(Some(termcolor::Color::Green)) .set_bold(true)) .unwrap(); - writeln!(&mut stream, "[{} {}] {}", now, Level::DEBUG, $str).unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::DEBUG, $str).unwrap(); stream.reset().unwrap(); }}; } @@ -121,7 +121,7 @@ macro_rules! debug { macro_rules! info { ($str:expr) => { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); - println!("{}", format!("[{} {}] {}", now, Level::INFO, $str)); + println!("{}", format!("[{} {}] {}", now, rall::Level::INFO, $str)); }; } @@ -138,7 +138,7 @@ macro_rules! warn { .set_fg(Some(termcolor::Color::Yellow)) .set_bold(true)) .unwrap(); - writeln!(&mut stream, "[{} {}] {}", now, Level::WARN, $str).unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::WARN, $str).unwrap(); stream.reset().unwrap(); }}; } @@ -156,7 +156,7 @@ macro_rules! error { .set_fg(Some(termcolor::Color::Red)) .set_intense(true)) .unwrap(); - writeln!(&mut stream, "[{} {}] {}", now, Level::ERROR, $str).unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::ERROR, $str).unwrap(); stream.reset().unwrap(); }}; } @@ -174,62 +174,7 @@ macro_rules! fatal { .set_fg(Some(termcolor::Color::Red)) .set_bold(true)) .unwrap(); - writeln!(&mut stream, "[{} {}] {}", now, Level::FATAL, $str).unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::FATAL, $str).unwrap(); stream.reset().unwrap(); }}; -} - -/// TODO -pub struct SimpleLogger { - standard_stream: StandardStream, -} - -impl Default for SimpleLogger { - fn default() -> Self { - Self { - standard_stream: StandardStream::stdout(ColorChoice::Always), - } - } -} - -/// TODO -impl SimpleLogger { - /// TODO - pub fn new(standard_stream: StandardStream) -> Self { - Self { standard_stream } - } - - /// TODO - pub fn log(&mut self, level: Level, str: &str) { - self.set_colour(&level); - writeln!(&mut self.standard_stream, "{} {}", level, str).unwrap(); - self.standard_stream.reset().unwrap(); - } - - /// TODO - fn set_colour(&mut self, logging_level: &Level) { - match logging_level { - Level::TRACE => self - .standard_stream - .set_color(ColorSpec::new().set_fg(Some(Color::Blue)).set_bold(true)) - .unwrap(), - Level::DEBUG => self - .standard_stream - .set_color(ColorSpec::new().set_fg(Some(Color::Green)).set_bold(true)) - .unwrap(), - Level::INFO => {} - Level::WARN => self - .standard_stream - .set_color(ColorSpec::new().set_fg(Some(Color::Yellow)).set_bold(true)) - .unwrap(), - Level::ERROR => self - .standard_stream - .set_color(ColorSpec::new().set_fg(Some(Color::Red)).set_intense(true)) - .unwrap(), - Level::FATAL => self - .standard_stream - .set_color(ColorSpec::new().set_fg(Some(Color::Red)).set_bold(true)) - .unwrap(), - } - } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 28812d2..04ed941 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use rall::{debug, error, fatal, info, Level, SimpleLogger, trace, warn}; +use rall::{debug, error, fatal, info, trace, warn}; fn main() { trace!("My Best Friend Hazel :D"); From 59680d00ea70bea0c41c97ab82f00285deaee03a Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 06:20:58 +0100 Subject: [PATCH 3/7] Reformat using 'rustfmt' --- src/lib.rs | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 76f7223..4ae7e58 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,9 +54,6 @@ doc =::embed_doc_image::embed_image ! ("unix_logs", "images/unix_logs.png")))] //! easy to understand API design that users can instantly get started with. use std::fmt::{Display, Formatter}; -use std::io::Write; - -use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; /// TODO pub enum Level { @@ -90,9 +87,11 @@ macro_rules! trace { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); stream - .set_color(termcolor::ColorSpec::new() - .set_fg(Some(termcolor::Color::Blue)) - .set_bold(true)) + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Blue)) + .set_bold(true), + ) .unwrap(); writeln!(&mut stream, "[{} {}] {}", now, rall::Level::TRACE, $str).unwrap(); stream.reset().unwrap(); @@ -108,9 +107,11 @@ macro_rules! debug { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); stream - .set_color(termcolor::ColorSpec::new() - .set_fg(Some(termcolor::Color::Green)) - .set_bold(true)) + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Green)) + .set_bold(true), + ) .unwrap(); writeln!(&mut stream, "[{} {}] {}", now, rall::Level::DEBUG, $str).unwrap(); stream.reset().unwrap(); @@ -134,9 +135,11 @@ macro_rules! warn { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); stream - .set_color(termcolor::ColorSpec::new() - .set_fg(Some(termcolor::Color::Yellow)) - .set_bold(true)) + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Yellow)) + .set_bold(true), + ) .unwrap(); writeln!(&mut stream, "[{} {}] {}", now, rall::Level::WARN, $str).unwrap(); stream.reset().unwrap(); @@ -152,9 +155,11 @@ macro_rules! error { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); stream - .set_color(termcolor::ColorSpec::new() - .set_fg(Some(termcolor::Color::Red)) - .set_intense(true)) + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Red)) + .set_intense(true), + ) .unwrap(); writeln!(&mut stream, "[{} {}] {}", now, rall::Level::ERROR, $str).unwrap(); stream.reset().unwrap(); @@ -170,9 +175,11 @@ macro_rules! fatal { let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); stream - .set_color(termcolor::ColorSpec::new() - .set_fg(Some(termcolor::Color::Red)) - .set_bold(true)) + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::Red)) + .set_bold(true), + ) .unwrap(); writeln!(&mut stream, "[{} {}] {}", now, rall::Level::FATAL, $str).unwrap(); stream.reset().unwrap(); From 6961b6844d935cfd259b4e804ef6d06d027d0dbb Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 08:33:54 +0100 Subject: [PATCH 4/7] Update docs --- src/lib.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4ae7e58..54f5d70 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ //! ## Feature Set //! //! - [x] Logging Levels -//! - [x] Coloured Output +//! - [x] Datetime & Coloured Output //! - [ ] Options for Datetime, Current Function, Line Number, Custom Colours, etc. //! - [ ] Custom Formatting //! - [ ] File support @@ -19,19 +19,19 @@ //! //! ## Quick Start //! -//! ```rust -//! use rall::{SimpleLogger, Level}; +//! For the fastest setup possible, declarative macros are exposed that have a predefined format. +//! This is to allow hassle-free and painless setup that will let you log instantly! //! -//! // Create Default SimpleLogger -//! let mut logger = SimpleLogger::default(); +//! ```rust +//! use rall::{debug, error, fatal, info, trace, warn}; //! //! // Log Out To Standard Output -//! logger.log(Level::TRACE, "My Best Friend Hazel :D"); -//! logger.log(Level::DEBUG, "My Best Friend Hazel :D"); -//! logger.log(Level::INFO, "My Best Friend Hazel :D"); -//! logger.log(Level::WARN, "My Best Friend Hazel :D"); -//! logger.log(Level::ERROR, "My Best Friend Hazel :D"); -//! logger.log(Level::FATAL, "My Best Friend Hazel :D"); +//! trace!("My Best Friend Hazel :D"); +//! debug!("My Best Friend Hazel :D"); +//! info!("My Best Friend Hazel :D"); +//! warn!("My Best Friend Hazel :D"); +//! error!("My Best Friend Hazel :D"); +//! fatal!("My Best Friend Hazel :D"); //! ``` //! #![cfg_attr(feature = "doc-images", @@ -55,13 +55,76 @@ doc =::embed_doc_image::embed_image ! ("unix_logs", "images/unix_logs.png")))] use std::fmt::{Display, Formatter}; -/// TODO +/// Represents all the possible logging levels: +/// +/// **TRACE**, +/// **DEBUG**, +/// **INFO**, +/// **WARN**, +/// **ERROR**, +/// **FATAL** pub enum Level { + /// # Usage + /// + /// For fine-grained information, only within rare cases where full visibility of what is + /// happening in your application is needed. + /// + /// # Colour + /// + /// Blue TRACE, + + /// # Usage + /// + /// Less granular when compared to [`TRACE`](Level::TRACE) but still more than what is needed + /// for normal use. This should be used for diagnosing issues and/or troubleshooting. + /// + /// # Colour + /// + /// Green DEBUG, + + /// # Usage + /// + /// Standard log level indicating that something has happened, all logs using [`INFO`](Level::INFO) + /// should be _purely informational_ and not require any further investigation. + /// + /// # Colour + /// + /// White INFO, + + /// # Usage + /// + /// Indicates that something _unexpected_ has happened within the program. This could represent + /// many things such as a problem or a simple disturbance. This should be used when something + /// unexpected has happened BUT the code can still continue to work. + /// + /// # Colour + /// + /// Yellow WARN, + + /// # Usage + /// + /// Indicates that the program has hit an issue that is preventing one or more functionalities + /// from properly functioning. This should be used when the application is currently displaying + /// incorrect behaviour that _needs_ to get fixed. + /// + /// # Colour + /// + /// Dark Red ERROR, + + /// # Usage + /// + /// Indicates that the program has entered a state in which it has lost _critical business + /// functionality_ and cannot be used in production anymore. This should be used when the + /// program is in **URGENT** need of attention and absolutely should not be in a live environment. + /// + /// # Colour + /// + /// Red FATAL, } From deaab372398fe9f45f6c5d62643745017df0a30d Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 09:02:54 +0100 Subject: [PATCH 5/7] Update examples --- README.md | 19 ++++++++----------- images/unix_logs.png | Bin 10050 -> 9062 bytes images/windows_logs.png | Bin 12592 -> 25540 bytes 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 54cc31a..ac553f2 100644 --- a/README.md +++ b/README.md @@ -22,18 +22,15 @@ And much more to come... soon™! ## Quick Start ```rust -use rall::{SimpleLogger, Level}; - -// Create Default SimpleLogger -let mut logger = SimpleLogger::default(); +use rall::{debug, error, fatal, info, trace, warn}; // Log Out To Standard Output -logger.log(Level::TRACE, "My Best Friend Hazel :D"); -logger.log(Level::DEBUG, "My Best Friend Hazel :D"); -logger.log(Level::INFO, "My Best Friend Hazel :D"); -logger.log(Level::WARN, "My Best Friend Hazel :D"); -logger.log(Level::ERROR, "My Best Friend Hazel :D"); -logger.log(Level::FATAL, "My Best Friend Hazel :D"); +trace!("My Best Friend Hazel :D"); +debug!("My Best Friend Hazel :D"); +info!("My Best Friend Hazel :D"); +warn!("My Best Friend Hazel :D"); +error!("My Best Friend Hazel :D"); +fatal!("My Best Friend Hazel :D"); ``` ### Windows Output @@ -48,4 +45,4 @@ logger.log(Level::FATAL, "My Best Friend Hazel :D"); I'm still incredibly early in my Rust journey and so I wanted to get comfortable and try to pick my own brain about exposing different API's in a Rust crate. I hope to expose an intuitive and easy to understand API design that users can -instantly get started with. +instantly get started with. \ No newline at end of file diff --git a/images/unix_logs.png b/images/unix_logs.png index d354204eda9117008aaaf71f5c97abbd49166076..997abcb999295e146df2c0604734104208fc9d80 100644 GIT binary patch literal 9062 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 literal 10050 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 diff --git a/images/windows_logs.png b/images/windows_logs.png index 0a5dce8ac75126543f5f82e166e0cb42c311d160..446fe9c3d5996259e6a7311a1ee7e377943a613e 100644 GIT binary patch literal 25540 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

0$T4mzwoxHB}#_K*bQ8^n-U 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�Gd$>f z@_b80D&2kMy!R~Y%HY6B&@O5c2(&|GZ<|QlE`4fKL1=lhzH1Nm zL==;wnhN1s*I?57`QSHNog8k^G6E~z{qs*ZK z);tQ>K+Vi|5K)j$_H5ok4-x$xoxrNA{!2$e%go|6dW_hwnFmU*B{S=>Gc(D5h@E#g zZFMO=D8dTvjOnKU`97rmNRz~Q_j0oAZd8yIVwtgmM%ddptLO5xesXr*@R93=ma)_8$`d~*Tev`7@aSTt4j?~-yC3+)ou{7 z8cm3nkVU)9MK%>DjMQDUxN}DPuKS{Eq7V{g9ucOrvnA@gB@4aJAm8{Bl&@R5=6F0N z+iZ%OGJfcV(TE?9p2|r+8 zg}XQ{a7&Y|Uwn=xp2daX}a zp=F$I)GV{5%)C+_@8|EbFxpx{gG?M8;9C~xnM(V-TeLhI0dU$sj3Q*O5Q}W43s-1} z@?TPd*#9jhh`I5;ps}R9{I&nj?%)XaKl91)-9?hJ@{c_a)j97QBe-fcWk-7 z{1V_>|AD&Q4gr->^n0);_;rnX{qTgni#r8 z6TY9i@chsFj9ZCB^F2rZPOILt2_wL#g6_yUnumwCz+xn?#_;_N)^RC3;Dn zlmd;aYcvZ|a*<))E-F+|ie#$W+`Hi?4s5Q@DqHyB2kn4c^`9~cUZh0qM^0N zGjC0JQX~QS4%C&X990f)vQvqW#JXING-3Sxdy}G z3o?{;zy`wIw2_;3Rd$VL|LrmR-0UQPuccEd=wu>mBLIi%Z!DTB(8_8y_2#ug<*vYivejMff*ZN|Jd1iv#I{Td}uh`qK5ejU- z!=E<*4Fb^lJXPuChcVDU4M%?&bwl*8Zlj;9&NT*CyjR_#ebbiP8l|GgFe#B-7k)-g zmc_6UdOtafWdnPI`@Q`jmFLdNy4@~yd1bWgC4tbvm+2OZwEYgW>7^xkQ&-&$L5b-{ zVIU;-Ljj-o^6Obrj~*Xinb|(QOZ@Ym915 z4|PoXd?zskc2o1oPd!v&NpN&VU&66oV6aAIKNDvprTLhs#ULZh6jcq|$l=FVaFU9V z5RCE8Sb<4m0~G0xI#AQ?Cpq`^hkR}$5dpQmsOoDOr4fxq-<0#o#4I+`%kBSb3SaU^Rsr2>zk0p5Rb0g8s?yO4(k#W?`D)w zU+qnZ%3ZWxP{F*I_1zbLpDN#w0d7#K2)+4>qLyEg8Nz3K^;ZLw=NLp~#q!hW_xn5Y zang*Wh$Z>h?|xj31@M0Ot`G^JfCsf==-E{!3%TzhwDEu^$@_R$BL(gIS8(wI@V&%0xW0HywkF~T;tyUq2k(G2&WEm zCBC=ta+=-M73r%D>b_h|AoZX!=z}VO4~AT~j`GS=MbGBzFB8wni?dg$FRTz`yjvMcL1Q;pV|uy0f|e_ycsDVp z%Zp9R@`;~@*BR|DAWR@Ucpul`G%>@eoK4HtbC9i_%B0GUIno5VPX!VIDPur zu$=zn{z(=)O?KTC{ON9Opcyw)sTb?UC5f_V?`AivQP`~AyuYt~hU2E3XI);=k6mUY zXfghJt4Hpxa`XN<19aAV)Zah>MH1#~z&{9Yf)$pHhsL|UMm8-whbb8Q0=wX}G&=>9 zqR{R=VUGtqh}OoXI^VclgpfW6W0wiVmF_+4Y-oXoGc^8@6dL|W3KHn5ZA#wVqztPH z8Q`xac*-~)XB5*BpG7X63s7cza6AnB81img(i?cr06xy`6us`6%dr1`Fy>mcgh~_W znrzWZRINLIEXTUPuizO>e}ZNfy!WCpLnq<7QnwtCh`U~3+v#1k;XbH{ezI z--+etY|{+M&rqQXI#j6QGfq{nV*9hc%-c+bvM5wOP_R8a9P|VwFm%1j8Qw`Idwf@D zc?AqS+dJiOhZ&w-jEUo$mXWcKp^5&7CZv9xn|_Pnz1$nT`ija_?6)8DPpk4QP|LP- zLIrj<_?oRTDX4B;hRSP_AD=dz z22Hw&1Lg+DQAajtIU&!z!Bm6vIT@?`A3wkM8N#;K!P&iZZL7qd$qHFOw-rk z3zX0xEmbl2f}0#zC;CF!B%_i5@L_-O&3pwaNRbO`n`f$OS9C>^j5x}I=`UMg6uS{` z-V>DzLf3{>xhHB3T>oS#hK1OidXK!Fe)JLIPP2D;FJCn`+%kmCG;_Nff&fT8;dXyp zWoGTJNQZ(5oTGzi=ckcrD-jb$4y%=?&@XB_?m#`OE&ydJ*5|N*mI5D;DBqtSt zsN4pBFMrN6SPjz#t{;8Zh5%6-QG`l!U74Dw*w0BmGwxA6_<=q=7R)>n=HokZzQd8m ztH_CxCRDOjUQ1_hmaJP|ryR1(ihOJ`AS9wOs_p#6phTo+Sw;XvjEOqA$-ypy^)>_> zuLQpgXuO~i-QVV(4E*Sy>Aev&@c%<0{6*$f`4V1I&l2EJ_hK+~RT*{C@AYMNd^ag2 z){P>XG}|ow4}2Kk3i^gjqbf);cfcmu&-s*V4}x+mb{t1v^XH6@y_X<4%pC^93mBS^ zGmM&#Zs`Ny4B$B=xo}Vl&|it54w~ew?C`Lv(zYJI!7@fOXbgFO+YW*O4`CkAw-okJ zIrkTz*I7^Hm5w#i55!aZa9sA4djC=C2rV9DeyaZ#LLjKgYon!OLz;l8k3OQ!RT&!t z_=vD;$%29XR3DI4c;{~Y|4@jVikZ7y-v5R|6lS!=T6ZTKw^N;D+wz}s?0@*|X^4si zY=S8(5AV@)w2Z)+4|C2Z2i;{V-C1GTM}2WE&HGKe%Q*ny#vv|H0(-0Jp5T6)b>0M4 z+5PjKE(0fMt-Mowx{mt#jp@$;n3V=X0+cDoEYo-vK7iqkT^r&-8dvK~>`%oRrvaaO z$8xj3iqU)2;pP)2u9Bf>wO3JQ(PQyFm@l(z2TVDbW7B1I$gX6s!pWNUw_{J*s?A3Rv zNEEF=X%^lNH=2dbyvWh9}aqmyWnH=LVw+7 z%4pS+6nNN-%DC>yh?O%`5zgdd`Let3s7S@5fqdOOGs)jgd<_ zrmx>7Uzcc3crt5QzPqS~4&g_+10(+=TfiDTcL-`b8>N)_FN7l){AfH$-%}T8Di=qJ z{^nZAv5f{#{iHrlYqEN2^s^5k#Zf|EIHR${?A9$PG`B5ShR1i`@)5bR2|&nc&S~(+ z&)@|L?Ijz;?8tQ=s6O)w_82^Yp*2QDpIYs7*K1U*MD*1fy_q7_Nus$6ep*K$~Ff}`UVCerRoa(=G5K7q8gDI417WW)vt@{qOD zD=|bc;vD>J2Ss>Za_l4C@80J!UEPy?s+eX;!3FJVxcCx1NhidDvGqRw0i$-c0?u2p z!Zcl6#5<##)J5H^nGA=P1j8E_=y03XWW8T80v1hhf7zK|pLDetB+Qgs!(r85T|(FT zk9Yy9Uon`<=VR6tDf&1dersMp?ro=HQ7~;EBNbr$I_s6Ls-81-RcGh`e1y!E>up`O`o>E%iQEITFr0s7n^kYC&u)Clm6XC{bms;adk`?mn4x7KBltEd?#2g4lm;F zt`EA{`sFw0r4^bo){NmQoWjT{KwfcwjFCdx4kck+&Wc&JuY^1gaHtxf>DVS%5r*O*9lYdH9|V$$QX>T;Z~@>tDYKvz29zgrZ`>PW`YSsWizq_bB{ot z`Bs#Gs~Pu&gCdKHUuv4DFha%>y+|Wk%0%vgW9Go7a!YvxUuBbj9CE zvdG5C5qjcm--3@UIUkJ0QSaP8wViQr_$(Ime1mW`eEn$k;D`&DJa9FdQ5 zculr^tDi@ug@^U&%C;kf{-jKF65{b{A?_KJiv$kJ(K(}jcP8m$s+GP$_ZreYBjX^qS6^(<=781_w-Lzm^JI-W9Jerd#b(={D+1N@4jQDP@l&GC2`vJ z_mruVAHRF^QTNT$?#oiNy zQR<8Yo@ZD#uC4fI>!J_;e|d-_j?ey-jE%_B{oD`2au5^^$ve(6bbN>MT8kv*q8lCM zhm}%#@BLTRSoo`IV0>3K`Gp;lnoD>)gb1a2U*2jUm1L!YK`;vimL=Wuq7UTXzr0@9wvl>E(Vr0Qe*JVFf@T+bVOS45SEWn-ni z@8lMj+dpuj8)05|Y2CHY*pBeY$V{grdHX>hQC#!m<#`=KzzWGctq${(Aonmi?`SW` zV)+tgNZmI$fJS7C%(iP%yoqXXVeo@KWx9|QL+2rlX5C~p8ChO-_o9iq6(`w6|I}Rg zO%|eJm*ND3V43bu14``JtUQFnT#TY%?xXjTVZx65jq<_!@o4qF4*JJBf@s*?THTYq z60*-iaCY=5Nt7!8Uu-1m%9NauNF>2vn?jkv_feDBy_BOYP|UdYIdBkOLq~K!o7~6k zdLHion}bMMo!m;8ftew>p7vuLnSpZTIvYYKn&(@{<0FK zr?!B6yPfM=&)g~aPpTM|%j!S4ORuB4OcC&UsTz4>K2Xu@==w1-`2>|?{|FE2_k6yOM#a| zs2NCFmC)KyB>PrRD~G;~&`n%};!j)y`TIkcCgfGk5^act1`{f+@!UtkD2#x9|40D) zn%{T6#)}}O{UPaVIDOWCvB_JK$ji>oQSN>l?_KAcW-f2{KEoCu)^SCH+LuU0{S(#T z`*&0WjNO#%`+^Bj!w~A+;r`jKt??qnuqg-67t6K}#$)wbyqSf0Zrze;p56Y(-AgCp z!)1(odQbyXTrfLh(d8)7@%L|H5oLvxCu9PN39azCrP{38z?L4FpC|4ES6$j*ms^g) zUBZCF$G++5UuNpQk124^Gy^CZGpzSVo?tzu9*|k$H;D`N^)=1A5>QIN_S|=_0~8KE z!QyrOXyl5myP41B8JjajopM1wq>dts71TFGWkh($VmHXcD|U+HP@~*2lF#N9 zCrxokaB=c$6i_jv$5VTV<%{M*Kw#?|4tM8z*Jt(uPxvOIp&nOk@#cn`Bn$tfibZ8K zu>OlKgs&E+$cA>j>qdP7vIojefAH#>@qsDRGlt| z;tBQq4^TM?M*)?tm+W_u>$`3g!k*{)n6ft2A1c2094#~+?KOZLkZgR|z|)fLMF^1b z@W^crb)SV_T^R*5*Wd-0lVxiZp}DlZwS>4v3Gm+XU%cbVh-!f|mK~JCfukUc{`@Y8 zOM98a#>mwVTVKAn9$DwjY+Q%JTjHUi7oJ}=GRj#mq09QyS401M8w*J5Mz1g6+Cmqh zO#!klk3$MqjY1)%1}_=f-FH0umS=@_=KgyZ3!26$WAistuNC%NEggRCDqsQ{u3)~_ zKh}kL+cOP%+26d#w$HePy87ZlKE$8vQM7 ze>~F|K&c%8!#fN7#dC?gmrlkIFArs`o?Ofy5VPMoh8*PcKrWuzF@5QF4t}J(og$r> z>xQl&#|Ye){Z{JHZ9V;!VK^BK;ClE^;zPF2z<8dW9l2J3b^he(L@Ye0%`Gwzd#U-F z7Ngg$x%E5+H&U(p!I=04Bak#y6k-kL>zlcVlMJlAJ!xv|2D8$dG-B>}zD-XCymAGBWn;jHUC;&@b! zb)Em_^4EB-nd^D(`}?^+Ll%7n`o%p*B|GEV(iLDEacEb8FOD#?r~2#qBc@o6vmejP z%Mr&@T1&PW+4gWfxzM)#l(v8Hd-#oK*>rXn9#%T-J`sAj`{PXmsjJD)#|_*rh&JG< z>Q&4q!>SE6ExnTcf+)-aHuT@W#+_sV&>{8ngWkR1BYF3r%RB8RS+WSt7UK-)IG4v zLG~#Upfm6j(#g5OMhbfay56E%%xl+i{HK-iFaEto32i*N3fa>6kRi^e?^K8(G9nuy zkBJN}c@j?XSF(_=v)-FCvo#IO`h=pw_tw|xIYPGE8cH$oxOPrb;48)5_9l)1z!Zjl!TP*JG4vbui49^>Oux^%GcF8{f`e8KV z=gImFy{y+d(PWdgOOF8);6N2G18+TFVLcQXuI1P`;58V`bOKfXUHpdh-%D-CN( zP9B2uoJwo|+F6&X{s2j*^L@f?f_?efh(6F=0q<9}G8u9z&fKOx3=mK}4C=)SC~TR% z#{WS;F=G`-=Kj7hob6S;O|jD)!lgQ`FifL)FiW}L)`Fo9>b2mPToSpG&j!8<4{t2L zG-2*NS89Cz?B=&UC16X^E(rK1taI-F(La&1CpA98`*xkfEp;J(RFL(L#fZE3AMuR0 zKrv#6^ix=JEoP&ajUZMDG;3&WDy*{KeOs_b%WQM^6x{^xY>&$c{RB{GXIHVEL%EnF znZz{+$k#^7MuF6>UQ;2Cdda1jN2uQ(BUb+;(o^5Fk|muObEzg2{CpUMeHi?6FRe8; z`!>{eOynt506SH`RJ?aZkd5?E>~2fDxTSU~U2~H@2xMke&;+~a-Y-@m!5-ph9X)d=99h+E8wXK(!_pa@dN3Me4k zG{6X=RKR~L08BBTwSuHK)D^kDIAj{FIA*uZ>&}dvI5{!-0U9f6k7UX)sJkBO`A9Tg za=KmJ%)v%;++(E^@K3mJKFOldJHIuKzsp&8FFJ3dIhqx2Nh&_E>tQ-#*FC!)H$~7( z2Ih`Wf)RFyw}d%QIQ;m=S`;$=yA`1TT9JS=l)fKhX@w~XaEX>&jp&k=&L|5Z#yKf1 zEmLbb4DFZO_2)^^UQ!wZ916+uU-@C(-zy3IZ(rS9Woi_{7%1i(?^p16e_xWTG96Ep zKhNu_&>{B@OpCYV7Ag;3SfaKoOY?^Hlr@w)NToR z55N2gBc2!+Z-iZrkq}88_hspI#Sk0Z5fDRGp?Wou0}o+c2_BK=#l2QCqpoQ7)=>v{ z69Jpy!*=BJ;|jz8Q-RQ!DmxiK7>|_`D(_TB6ZiMed!t~+?n~!hfaK^a5CDaC=A$vV z5*c!UJ6HOw1Lj_J_$hsMZq^$NR^kn@<9?iX3C>slyP1073>b%{SNS}#Adm41)(=_*XFT{iTxT2RYp$S$Y)0N zIB(CGrN;34=)4}7qU0ZITK#nC8`5rw_WA>5)ZPJQbsmig(zRP?tV+h9m3caM=10M8 z$Yd7fbz@+}gHI$WoNin@zXoU%cw(|6quQG|h)N87%GcVVFoMJUm@%Uuf=0B$r1m+N+{6OQ0x%Z||b70Jgp{kB+kq({b6P}_*VZcO%C?dg!ER)zWR zFTrc4Z4~IG-x?qH9L7M;(S&fx0Bh2ct9*SGP|&m&prvY~5kW1i8ls=3Bn%npYZ7 zyHJe%g#emK$^_2o;h1GSwAmI zk!t605~Sb;f4=dK)4aC=zfKaO+zx72+LnRZp_j_Ya~SbsXv<~V35nmAXLLGvW|pzd zyKg%OvT2UHK*fuZ!K&YE6mI&2e@0ko)};M%OK4Q>zw@+7vHE6=re1g^VV!5JE*K!R zb{6EPXW+a#vTO^m8#zbphEv_|W@8B|>N+%)%yxynih>J`9AD;t!W=Qwhe#a|NW^vigg7YcY%Yj?D26tQ%w zjZr_8DJr#>54l`4^Z{0b4>74wWln9Ew(wTPj^Z;>7eqU^T~V4%R=GOpq_a6|8^*oy zvZbyPs(&4r_%^^4#E_0DllyP)9PQvQJ?L5!w6`V4&Fd;$qR@F$ZlP_HH_()l<)nm6(?0`~$uC(pvy>eS1`!Sh-p!RTUG=*H@#TQ@ zJ_-dY3kwvEl1vz>y=>8($m_e-xhUCW&k@kKlC8S8su)dJ-`vADM%pyfvVQ%do|Ae) z9?2Z;{)-9*7^%cr+ot8BnYQndw{WhIapvuN6bfk?dd%{Z{Ps!|N^mxJ#)$b-#xTSq z$4g!B-naJjFo~Oq0ss!h{{S3}ce?#$qFx?>D(0sz^k{V{Mv~@SRMbCQp~N90%_u>C zvWLb^>~PkKnJj$4-(aHx4?72atFA$Wss*rni!8~)<1=l?uIxR;&PoIuNCMSI0*Rj& zAhmI0s6@;n55`r0#0-=)gSJR@3#jr)_dRZ?Ts>|mo+PcUJV%8BiWq{mV*5|c33aHk ziuB1hSq{@1r)gk_7LfUb*Fx}h3n{tXaROG3;Dii)m0*ku6f;|CCcySl(3%(?n;G+r(}1TBNDD4bwmVAgO|NY&bCWxf&>e2|=LpM^1LfvM1Z zAj2W4#3K;Fud|?-*yl@%XQ{P&%CS>oRXOrm_!o*XbCY$P!14K}#@)p3gPs@m&S2X+ zyC8XFYR_4PY>?9uYDj}WSk-XUw&}(!nx0po3 zIl%3$8-l7s4B?oBx0vUZaCb{#$k=J(8@qg1IrmQ;?*A^5STI^U2id63^_Ka~bMQaf zbkWlP#@)CcwM3l(lktW*E=66w*k?}%W##(Xe2sL z5zy0`hS+U@{@Ecxkhng~%t$0@+Wmc~E<*_D)4#h1!X?s5viVZ>op2tiJs1;q)~@TA zX3NA}PxuWip$mR42t2F5k&sSyR;PT>S{YHjUkBLow7# z<+ZmaEQmEm2r5+c3iO&I^>my^tasMy2ffzl6Lm1g2=AvYxC^Tfaz`Y`nJ#M zE5^ctkSORj))kR-UF)y1h;@#ZGC|E#PTKcRU>)Saze|YM?SkxcH8#ACF5HFt>LwQ_ zA8iKg_vg(&4Q>d&YIymtOO4;2h%O}s%*ujLLH_2#{U>M#2W$x;Ip~EcA^t3iSlM)6 zmMTtfC+F@;)aUC0mL8k&#~nlrVZ(%Q()}dx)<6+{9D_PmG9iDmb~yR^A1Vk^kBDp% zhMuv*Xk|>7km=`@+G;)s#~>hdP$T(Q_@mPvTyw$>7I9z zn#nZdat&RymrzTIonyE@O6{uG{`f@23;lMI9T_ z!XWA5pGThF)CqDufa0DIE@VSrb9Q}Rq zTjclVal9+X{NDbZuQ+#jClV@qA0LEIvKh{uzC|NYuwQ4o;PI*PJ!YHnHY(q>$0%6E z_+;C)t0x>_E$!Y*c>SXr6{kHqD5pir6pt zH2K|q5E9G5pEhH@ss7J_-~K-PgE8FW35LOWKmnMMx9rrG$&V7)i8`YE!2!=-73W2h zkm-n|W#eC9S4jik@g}?1xpIAjMiffKH%trb3B7J>D8^xhaZRS{GSC;Hlg|CG;r>vt zPuR9*gy|q*m4bTZYXnc(h*@;~H4r>MA|Y=x+O#XON6NCa)cqgAy@{RA|-2s3b`y-E@Cp4`2CWuNK!V+qD4> z%rra6t~dWW$b-Y!I#-%STeZ)MM(Xp=t#Q0S6GNJEDGvtmCC!;9wH1@^C({K$WNP7u zeU?qmr1LG?F{mbuuAL3YTFK9QyRnNGCH1d`5K?~l?SjZ!{%L1k;Ru7G0t#Xl3e$2V zuCT4G*Ma0bv$Y83gCer64TQ@oVm=K9xUm&-A*RG)E4TtIxZsx2f)m=qCB%v#i~i*Q z_#>&UCHCKN$4}02MXrAC{@GWv;@I|Y1AI@LZEfZ+!l7`~)KH7rhQLzJ+LN+i+g4W8 z`7^l-5-*i2xE8=0RIQ4)pB&*0+0QMk86 zcA&^%x2Og2L-{i(U6jC3u27i;`GcWZHJM0hAX_f(J?=1oNWUW~F;D)bhByS-*0hZ+ z)3rKFTNv)#NcBRi6s(p7TyOG{WOpqko}DP(mRa^pg}*H2Qdi8Ec;0b-rGzPLe^_;X zMm%j;G0ve3s`IZ>dpm5^wae}-DmaUGq=O0m|CZT_ylBlIJB*)|1;!PnAGt>Wj}$WF ziwvT8KcRwTCgQ0rId76Y)?DCOLA&gl+072v3md3@P4YQQ^`#^DDb9>uV0s_+NZ71z z27EpV>_`jy$hLS_u)~j{(~25ZyVc@cL=_amDmZ_K9Dtjd$>Ry&-Y1zfx7Zc)G4jSJet2<1-{H9zLuS4+SKVQ`JR7dNEQ{ zCj0jdGPY^Nie~nwkmx1eO@}wl5iTH&=dmzGRWa@t(pRKZZOBQY=tnGc>ax2c8<^ww z#S{K*W-p=t_nEz%K=0!>8yCi)0g8p%(IXwFHxUunp|spN(b~{{<7WX$3ZhYv*N(ei zWdE4hftf`QN6`wCqFvWJ+uf+dv`#Y_bQPjl{s7L2r-e4vD4h)nb4f~|_)3umr^YTV zB0PQiJ%8k^HEWJYPK_EUdW9{o8qL7wJA!PjE23vjHx)Yym8tY9-l5&KL<)VeiG8L1 zkY>S}+xi$!STUJvCcE{)mM30DrDm&h^qkjMG_>XqYKZK-dU&+`P2K)aXa11d>t+AP z)LwddWPluT8Cbo&MlWj67a!3H)mAlFg=XYwoMn<5my$mJau;c!_t() zVaj*18Y#0xDMoLtC706kK=4oZ^luZz-91Dp-{oI=L>`2L8gd@+k-yxDuPEcPPoDF0 zaH_2;n7bl zae#uUDp$|zGf24i<|@Bun3KfCat(Bv&S*Qu4w1dsWpZ(uEq(X0Grent4SH>lx?JJ619JPD zzJiwYsaf(_wpRt(0`#>;xPBR`6LOKLG!a~pDt(Z-NMI&ff)~)AgXF&AagZG?Em$p% ziGu}zIMBlq2YY{y>m)rJW%z8R_1TuYfC5;}F^Cbv8w{P`4dnmM8>sQoE?TF{op3*b z>B~Zp)-gY}pSJ*at~~-37C#}eyOdE2)9C+0Krb0pe&0b!L7~}OI-j0$i$FAW*pcxr zyO4$>3%t&nc~#qe5|)j5R5~eqth41~0KsDt>TZ7M=HVwLm+co>5SA z>E(k#iMI?{B$al{d|RUHTe^x#GJABLvkIi5GTl5&_Oe(({%MvcShr&X;C2*YIC48W zZKtnI^IVVl%?k|FF|yw4Cz*fO)<>g5I_F6P zEnEN~Y|QaUWNMB+j^k7eKJ(1tZHvjYjk5WJrw3OuJUTKv%TKF-2S7%bSV^3K6K!iY zX_tl3C?$$024*~gdwi8vuNk&R73A}frcUj^l7bOfQa}wwyeWjAmKLig>g*|jHfOo^ z?we_459JK$N9BJJK!=0o;ydysr^Rv|@n&a-Z;i!zzmGkM2Z$?VThBK;VQr3on^pYZ zWB9=fP33hT-?b}V(Wgmo@LwQl{JhtFp_Nz=un86ICi|M3bT9z0pu7B$VAWK=>3C21yuM=a}C>$;0rm>-i zWW$Sr}kSJ;~Jal-H zau;7BvG?K7DA?djpwrgrnl&0Ny$>*#uRaTOLotC2@f#myhg37JvxuT+58$os*QsZ_ zsm$1HliWI68m9Q%MqNhtm7cy2r;^sErgV}e$&X;+M%;J|J!|6B&VD?tNZx6DoxW0C z){A&wyQUWMiv!4QW5Hv4=Mg1gM=LxA!>AFxFL42cts3*l#j!9Y+S7NJ@71?bod!{<<{?IMSeX%XB@d43AXB{ z{J(h=7e+AmeZ`B#S{9<%ejo9_{Qa7apLXBdo5Ci+S|GU$_~ngLO1D(x3uKLa{|jKA B+0Fm} literal 12592 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 From e046be656e5b7119d8e0f9ea68ad82c0cffa1271 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 09:03:08 +0100 Subject: [PATCH 6/7] Ensure INFO logs are coloured white --- src/lib.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 54f5d70..f1dd7cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -184,8 +184,20 @@ macro_rules! debug { #[macro_export] macro_rules! info { ($str:expr) => { + use std::io::Write; + use termcolor::WriteColor; + let now = chrono::Utc::now().format("%Y-%M-%dT%H:%M:%S%z"); - println!("{}", format!("[{} {}] {}", now, rall::Level::INFO, $str)); + let mut stream = termcolor::StandardStream::stdout(termcolor::ColorChoice::Always); + stream + .set_color( + termcolor::ColorSpec::new() + .set_fg(Some(termcolor::Color::White)) + .set_bold(true), + ) + .unwrap(); + writeln!(&mut stream, "[{} {}] {}", now, rall::Level::INFO, $str).unwrap(); + stream.reset().unwrap(); }; } From e49920e19f5b4bd75fc40da7cd2ab69853b372ef Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 3 Apr 2022 09:25:02 +0100 Subject: [PATCH 7/7] Update docs --- README.md | 3 ++ images/unix_logs.png | Bin 9062 -> 25681 bytes src/lib.rs | 97 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ac553f2..456f2a6 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ And much more to come... soon™! ## Quick Start +For the fastest setup possible, declarative macros are exposed that have a predefined format. +This is to allow hassle-free and painless setup that will let you log instantly! + ```rust use rall::{debug, error, fatal, info, trace, warn}; diff --git a/images/unix_logs.png b/images/unix_logs.png index 997abcb999295e146df2c0604734104208fc9d80..4e632ba67cd3fd51ac12a606a35274e9bba018b2 100644 GIT binary patch literal 25681 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 b5`33JVAP;A$rk&nkiRrl^;F7~Y+n8k&{@YG literal 9062 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 diff --git a/src/lib.rs b/src/lib.rs index f1dd7cb..ed8777d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,8 +36,8 @@ //! #![cfg_attr(feature = "doc-images", cfg_attr(all(), -doc =::embed_doc_image::embed_image ! ("windows_logs", "images/windows_logs.png"), -doc =::embed_doc_image::embed_image ! ("unix_logs", "images/unix_logs.png")))] +doc = ::embed_doc_image::embed_image!("windows_logs", "images/windows_logs.png"), +doc = ::embed_doc_image::embed_image!("unix_logs", "images/unix_logs.png")))] //! //! ### Windows Output //! @@ -141,6 +141,21 @@ impl Display for Level { } } +/// # Usage +/// +/// For fine-grained information, only within rare cases where full visibility of what is +/// happening in your application is needed. +/// +/// # Colour +/// +/// Blue +/// +/// # Example +/// +/// ```rust +/// # use rall::trace; +/// trace!("Hazel!"); +/// ``` #[macro_export] macro_rules! trace { ($str:expr) => {{ @@ -161,6 +176,21 @@ macro_rules! trace { }}; } +/// # Usage +/// +/// Less granular when compared to [`TRACE`](Level::TRACE) but still more than what is needed +/// for normal use. This should be used for diagnosing issues and/or troubleshooting. +/// +/// # Colour +/// +/// Green +/// +/// # Example +/// +/// ```rust +/// # use rall::debug; +/// debug!("Hazel!"); +/// ``` #[macro_export] macro_rules! debug { ($str:expr) => {{ @@ -181,6 +211,21 @@ macro_rules! debug { }}; } +/// # Usage +/// +/// Standard log level indicating that something has happened, all logs using [`INFO`](Level::INFO) +/// should be _purely informational_ and not require any further investigation. +/// +/// # Colour +/// +/// White +/// +/// # Example +/// +/// ```rust +/// # use rall::info; +/// info!("Hazel!"); +/// ``` #[macro_export] macro_rules! info { ($str:expr) => { @@ -201,6 +246,22 @@ macro_rules! info { }; } +/// # Usage +/// +/// Indicates that something _unexpected_ has happened within the program. This could represent +/// many things such as a problem or a simple disturbance. This should be used when something +/// unexpected has happened BUT the code can still continue to work. +/// +/// # Colour +/// +/// Yellow +/// +/// # Example +/// +/// ```rust +/// # use rall::warn; +/// warn!("Hazel!"); +/// ``` #[macro_export] macro_rules! warn { ($str:expr) => {{ @@ -221,6 +282,22 @@ macro_rules! warn { }}; } +/// # Usage +/// +/// Indicates that the program has hit an issue that is preventing one or more functionalities +/// from properly functioning. This should be used when the application is currently displaying +/// incorrect behaviour that _needs_ to get fixed. +/// +/// # Colour +/// +/// Dark Red +/// +/// # Example +/// +/// ```rust +/// # use rall::error; +/// error!("Hazel!"); +/// ``` #[macro_export] macro_rules! error { ($str:expr) => {{ @@ -241,6 +318,22 @@ macro_rules! error { }}; } +/// # Usage +/// +/// Indicates that the program has entered a state in which it has lost _critical business +/// functionality_ and cannot be used in production anymore. This should be used when the +/// program is in **URGENT** need of attention and absolutely should not be in a live environment. +/// +/// # Colour +/// +/// Red +/// +/// # Example +/// +/// ```rust +/// # use rall::fatal; +/// fatal!("Hazel!"); +/// ``` #[macro_export] macro_rules! fatal { ($str:expr) => {{