#![doc = include_str!("../README.md")]
mod ui;
use std::sync::Mutex;
pub use ui::logger_ui;
pub use ui::LoggerUi;
use log::SetLoggerError;
use ui::try_mut_log;
const LEVELS: [log::Level; log::Level::Trace as usize] = [
log::Level::Error,
log::Level::Warn,
log::Level::Info,
log::Level::Debug,
log::Level::Trace,
];
pub struct EguiLogger;
pub struct Builder {
max_level: log::LevelFilter,
}
impl Default for Builder {
fn default() -> Self {
Self {
max_level: log::LevelFilter::Debug,
}
}
}
impl Builder {
pub fn build(self) -> EguiLogger {
EguiLogger
}
pub fn max_level(mut self, max_level: log::LevelFilter) -> Self {
self.max_level = max_level;
self
}
pub fn init(self) -> Result<(), SetLoggerError> {
log::set_logger(&EguiLogger).map(|()| log::set_max_level(self.max_level))
}
}
impl log::Log for EguiLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
metadata.level() <= log::STATIC_MAX_LEVEL
}
fn log(&self, record: &log::Record) {
if self.enabled(record.metadata()) {
try_mut_log(|logs| logs.push((record.level(), record.args().to_string())));
}
}
fn flush(&self) {}
}
#[deprecated(
since = "0.5.0",
note = "Please use `egui_logger::builder().init()` instead"
)]
pub fn init() -> Result<(), SetLoggerError> {
builder().init()
}
#[deprecated(
since = "0.5.0",
note = "Please use `egui_logger::builder().max_level(max_level).init()` instead"
)]
pub fn init_with_max_level(max_level: log::LevelFilter) -> Result<(), SetLoggerError> {
builder().max_level(max_level).init()
}
pub(crate) type GlobalLog = Vec<(log::Level, String)>;
static LOG: Mutex<GlobalLog> = Mutex::new(Vec::new());
pub fn builder() -> Builder {
Builder::default()
}