Skip to main content

hyperlane_cli/logger/
impl.rs

1use crate::*;
2
3/// Implementation of the `log::Log` trait for colored console output.
4impl log::Log for Logger {
5    /// Determines whether a log record with the specified metadata would be logged.
6    ///
7    /// # Arguments
8    ///
9    /// - `&log::Metadata` - The metadata of the log record.
10    ///
11    /// # Returns
12    ///
13    /// - `bool` - Whether the record's level is within the maximum log level.
14    fn enabled(&self, metadata: &log::Metadata) -> bool {
15        metadata.level() <= log::max_level()
16    }
17
18    /// Logs a record with colored console output.
19    ///
20    /// # Arguments
21    ///
22    /// - `&log::Record` - The log record to output.
23    fn log(&self, record: &log::Record) {
24        if !self.enabled(record.metadata()) {
25            return;
26        }
27        let now_time: String = color_output::time();
28        let level: log::Level = record.level();
29        let args: &std::fmt::Arguments<'_> = record.args();
30        let file: Option<&str> = record.file();
31        let module_path: Option<&str> = record.module_path();
32        let target: &str = record.target();
33        let line: u32 = record.line().unwrap_or_default();
34        let location: &str = file.unwrap_or(module_path.unwrap_or(target));
35        let time_text: String = format!("{LOG_SPACE}{now_time}{LOG_SPACE}");
36        let level_text: String = format!("{LOG_SPACE}{level}{LOG_SPACE}");
37        let args_text: String = format!("{args}{LOG_SPACE}");
38        let location_text: String = format!("{LOG_SPACE}{location}{LOG_COLON}{line}{LOG_SPACE}");
39        let color: ColorType = match record.level() {
40            log::Level::Trace => ColorType::Use(Color::Magenta),
41            log::Level::Debug => ColorType::Use(Color::Cyan),
42            log::Level::Info => ColorType::Use(Color::Green),
43            log::Level::Warn => ColorType::Use(Color::Yellow),
44            log::Level::Error => ColorType::Use(Color::Red),
45        };
46        let mut time_output_builder: ColorOutputBuilder<'_> = ColorOutputBuilder::new();
47        let mut level_output_builder: ColorOutputBuilder<'_> = ColorOutputBuilder::new();
48        let mut location_output_builder: ColorOutputBuilder<'_> = ColorOutputBuilder::new();
49        let mut args_output_builder: ColorOutputBuilder<'_> = ColorOutputBuilder::new();
50        let time_output: ColorOutput<'_> = time_output_builder
51            .text(&time_text)
52            .bold(true)
53            .color(ColorType::Use(Color::White))
54            .bg_color(ColorType::Use(Color::Black))
55            .build();
56        let level_output: ColorOutput<'_> = level_output_builder
57            .text(&level_text)
58            .bold(true)
59            .color(ColorType::Use(Color::White))
60            .bg_color(color)
61            .build();
62        let location_output: ColorOutput<'_> = location_output_builder
63            .text(&location_text)
64            .bold(true)
65            .color(color)
66            .build();
67        let args_output: ColorOutput<'_> = args_output_builder
68            .text(&args_text)
69            .bold(true)
70            .color(color)
71            .endl(true)
72            .build();
73        ColorOutputListBuilder::new()
74            .add(time_output)
75            .add(level_output)
76            .add(location_output)
77            .add(args_output)
78            .run();
79    }
80
81    /// Flushes any buffered log output.
82    fn flush(&self) {}
83}
84
85/// Implementation of associated functions for `Logger`.
86impl Logger {
87    /// Initializes the global logger with the specified maximum log level.
88    ///
89    /// # Arguments
90    ///
91    /// - `LevelFilter` - The maximum log level to enable.
92    pub fn init(level_filter: log::LevelFilter) {
93        let _ = log::set_logger(&LOGGER);
94        log::set_max_level(level_filter);
95    }
96}