use crate::ui::tui::log_buffer::LogBuffer;
use crate::ui::tui::log_layer::TuiLogLayer;
use once_cell::sync::OnceCell;
use std::sync::{Arc, Mutex};
use tracing_subscriber::{prelude::*, EnvFilter};
static LOG_BUFFER: OnceCell<Arc<Mutex<LogBuffer>>> = OnceCell::new();
pub fn create_env_filter(verbosity: u8) -> EnvFilter {
if std::env::var("RUST_LOG").is_ok() {
EnvFilter::from_default_env()
} else {
match verbosity {
0 => EnvFilter::new("bssh=warn"),
1 => EnvFilter::new("bssh=info"),
2 => EnvFilter::new("bssh=debug,russh=debug"),
_ => EnvFilter::new("bssh=trace,russh=trace,russh_sftp=debug"),
}
}
}
fn is_tui_likely() -> bool {
let is_tty = atty::is(atty::Stream::Stdout);
let in_ci = std::env::var("CI").is_ok();
is_tty && !in_ci
}
pub fn init_logging(verbosity: u8) -> Arc<Mutex<LogBuffer>> {
let log_buffer = Arc::new(Mutex::new(LogBuffer::default()));
let _ = LOG_BUFFER.set(Arc::clone(&log_buffer));
let filter = create_env_filter(verbosity);
if is_tui_likely() {
let tui_layer = TuiLogLayer::new(Arc::clone(&log_buffer));
tracing_subscriber::registry()
.with(filter)
.with(tui_layer)
.init();
} else {
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_target(true)
.init();
}
log_buffer
}
pub fn init_logging_console_only(verbosity: u8) {
let filter = create_env_filter(verbosity);
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_target(true)
.init();
}
pub fn init_logging_tui_only(verbosity: u8) -> Arc<Mutex<LogBuffer>> {
let log_buffer = Arc::new(Mutex::new(LogBuffer::default()));
let _ = LOG_BUFFER.set(Arc::clone(&log_buffer));
let filter = create_env_filter(verbosity);
let tui_layer = TuiLogLayer::new(Arc::clone(&log_buffer));
tracing_subscriber::registry()
.with(filter)
.with(tui_layer)
.init();
log_buffer
}
pub fn get_log_buffer() -> Option<Arc<Mutex<LogBuffer>>> {
LOG_BUFFER.get().cloned()
}
pub fn disable_fmt_logging() {
}
pub fn enable_fmt_logging() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_env_filter() {
let _ = create_env_filter(0);
let _ = create_env_filter(1);
let _ = create_env_filter(2);
let _ = create_env_filter(3);
}
}