use std::env::home_dir;
use std::error::Error as StdError;
use std::fs::{OpenOptions, create_dir_all};
use std::io::{self, Write};
pub fn initialize_logger(log_file: &str) -> Result<(), Box<dyn StdError + Send + Sync>> {
if log_file.contains('/') {
return Err(Box::<dyn StdError + Send + Sync>::from(
"Log file path cannot contain directories.",
));
}
let home = home_dir()
.ok_or_else(|| Box::<dyn StdError + Send + Sync>::from("Unable to find home directory."))?;
let log_dir = home.join(".config/getquotes");
create_dir_all(&log_dir)?;
let log_path = log_dir.join(log_file);
let file = OpenOptions::new()
.create(true)
.append(true)
.open(&log_path)?;
let file = io::LineWriter::new(file);
let logger = env_logger::Builder::from_default_env()
.format(|buf, record| {
writeln!(
buf,
"{} [{}] - {}",
jiff::Zoned::now().strftime("%Y-%m-%dT%H:%M:%S"),
record.level(),
record.args()
)
})
.target(env_logger::Target::Pipe(Box::new(file)))
.build();
if log::set_boxed_logger(Box::new(logger)).is_ok() {
log::set_max_level(log::LevelFilter::Info);
} else {
return Ok(());
}
log::info!("Logger initialized");
log::logger().flush();
Ok(())
}