use std::backtrace::Backtrace;
use colored::{Color, Colorize};
use flexi_logger::{DeferredNow, FileSpec, Logger, LoggerHandle, Record, style};
use crate::cli::Args;
#[inline]
pub fn setup(args: &Args) -> LoggerHandle {
let handle = {
let mut logger = Logger::try_with_env_or_str("info")
.expect("Expected flexi_logger to be able to parse env or string")
.adaptive_format_for_stderr(flexi_logger::AdaptiveFormat::Custom(
log_format,
color_log_format,
))
.log_to_stderr();
if args.log_options.log_to_file {
if args.log_options.file_color_log {
logger = logger.format_for_files(color_log_format);
} else {
logger = logger.format_for_files(log_format);
}
let filespec = FileSpec::try_from(&args.log_options.log_file)
.expect("Expected logging file to be parsed correctly");
logger = logger
.log_to_file(filespec)
.append()
.duplicate_to_stderr(flexi_logger::Duplicate::All);
}
logger
.start()
.expect("Expected flexi_logger to be able to start")
};
if args.log_options.log_to_file {
println!(
"Logging to file \"{}\"",
args.log_options.log_file.to_string_lossy()
);
}
handle.flush();
let original_hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |panic| {
let backtrace = Backtrace::capture();
error!("Panic occured:\n{panic}\n{backtrace}");
original_hook(panic);
}));
info!("Termusic(tui) version {}", env!("TERMUSIC_VERSION"));
handle
}
pub fn log_format(
w: &mut dyn std::io::Write,
now: &mut DeferredNow,
record: &Record<'_>,
) -> Result<(), std::io::Error> {
write!(
w,
"[{} {} {}]: {}", now.format_rfc3339(),
record.level(),
record.module_path().unwrap_or("<unnamed module>"),
&record.args()
)
}
pub fn color_log_format(
w: &mut dyn std::io::Write,
now: &mut DeferredNow,
record: &Record<'_>,
) -> Result<(), std::io::Error> {
let level = record.level();
write!(
w,
"[{} {} {}]: {}",
now.format_rfc3339().color(Color::BrightBlack), style(level).paint(format!("{level:5}")), record.module_path().unwrap_or("<unnamed module>"),
&record.args() )
}