Add crate with simple logger code

pull/3/head
Hammy 3 years ago
parent 83ef17da92
commit a9ce90231c

@ -0,0 +1,23 @@
[package]
name = "rall"
version = "0.1.0"
edition = "2021"
authors = ["Goudham Suresh <sgoudham@gmail.com>"]
description = "Really...? Another Logging Library? Yes! Incredibly Intuitive & Simple"
license = "MIT"
readme = "README.md"
repository = "https://github.com/sgoudham/rall"
keywords = ["logger", "logging", "simple", "coloured", "color"]
categories = ["development-tools::debugging"]
[dependencies]
embed-doc-image = "0.1.4"
termcolor = "1.1.3"
[features]
doc-images = []
[package.metadata.docs.rs]
# docs.rs uses a nightly compiler, so by instructing it to use our `doc-images` feature we
# ensure that it will render any images that we may have in inner attribute documentation.
features = ["doc-images"]

@ -0,0 +1,142 @@
//! # Really...? Another Logging Library?
//!
//! **Yes!**
//!
//! ## Description
//!
//! _rall_ is an incredibly simple and intuitive logger, consider this crate a _failure_ if you
//! can't get setup within **30 seconds!**
//!
//! ## Feature Set
//!
//! - [x] Logging Levels
//! - [x] Coloured Output
//! - [ ] Options for Datetime, Current Function, Line Number, Custom Colours, etc.
//! - [ ] Custom Formatting
//! - [ ] File support
//!
//! And much more to come... soon™!
//!
//! ## Quick Start
//!
//! ```rust
//! use rall::SimpleLogger;
//!
//! // Create Default SimpleLogger
//! let mut simple_logger = SimpleLogger::default();
//!
//! // 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::CRITICAL, "My Best Friend Hazel :D");
//! ```
//!
#![cfg_attr(feature = "doc-images",
cfg_attr(all(),
doc = ::embed_doc_image::embed_image!("windows_logs", "images/windows_logs.png")))]
//!
//! ### Windows Output
//!
//! ![Example Logs][windows_logs]
//!
//! ### Unix Output
//!
//!
//!
//! ### 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 achieve 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
pub enum Level {
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
CRITICAL,
}
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::CRITICAL => write!(f, "[FATAL]"),
}
}
}
/// 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 => self
.standard_stream
.set_color(ColorSpec::new().set_fg(None))
.unwrap(),
Level::WARN => self
.standard_stream
.set_color(
ColorSpec::new()
.set_fg(Some(Color::Yellow))
.set_dimmed(true),
)
.unwrap(),
Level::ERROR => self
.standard_stream
.set_color(ColorSpec::new().set_fg(Some(Color::Red)))
.unwrap(),
Level::CRITICAL => self
.standard_stream
.set_color(ColorSpec::new().set_fg(Some(Color::Red)).set_intense(true))
.unwrap(),
}
}
}
Loading…
Cancel
Save