Skip to main content

pimalaya_cli/
log.rs

1//! Logger initialization from the shared log flags.
2
3use std::fs::OpenOptions;
4
5use anyhow::Result;
6use env_logger::{Builder, Target};
7use log::LevelFilter;
8
9use crate::clap::args::LogFlags;
10
11/// Initializes the process logger from the shared log flags.
12pub struct Logger;
13
14impl Logger {
15    /// Initialises `env_logger` from `log`. When [`LogFlags::file`]
16    /// is set the log target is opened in append mode (creating it
17    /// if missing) and used for output; otherwise logs go to stderr
18    /// as usual.
19    ///
20    /// Opening the log file is fallible: if the caller asked for one
21    /// but we cannot create or open it, the error is returned rather
22    /// than silently falling back to stderr and polluting interactive
23    /// prompts.
24    pub fn try_init(log: &LogFlags) -> Result<()> {
25        let mut builder = Builder::new();
26
27        match log.level {
28            Some(level) => {
29                builder.filter_level(level.into());
30            }
31            None => {
32                builder.filter_level(LevelFilter::Off);
33                builder.parse_default_env();
34            }
35        }
36
37        if let Some(path) = &log.file {
38            let file = OpenOptions::new().create(true).append(true).open(path)?;
39            builder.target(Target::Pipe(Box::new(file)));
40        }
41
42        builder.try_init()?;
43        Ok(())
44    }
45}