tracel_xtask/
logging.rs

1use std::io::Write;
2
3/// Initialise and create a `env_logger::Builder` which follows the
4/// GitHub Actions logging syntax when running on CI.
5pub fn init_logger() -> env_logger::Builder {
6    let mut builder = env_logger::Builder::from_default_env();
7    builder.target(env_logger::Target::Stdout);
8
9    // Find and setup the correct log level
10    builder.filter(None, get_log_level());
11    builder.write_style(env_logger::WriteStyle::Always);
12
13    // Custom Formatter for Github Actions
14    if std::env::var("CI").is_ok() {
15        builder.format(|buf, record| match record.level().as_str() {
16            "DEBUG" => writeln!(buf, "::debug:: {}", record.args()),
17            "WARN" => writeln!(buf, "::warning:: {}", record.args()),
18            "ERROR" => {
19                writeln!(buf, "::error:: {}", record.args())
20            }
21            _ => writeln!(buf, "{}", record.args()),
22        });
23    }
24
25    builder
26}
27
28/// Determine the LogLevel for the logger
29fn get_log_level() -> log::LevelFilter {
30    // DEBUG
31    match std::env::var("DEBUG") {
32        Ok(_value) => return log::LevelFilter::Debug,
33        Err(_err) => (),
34    }
35    // ACTIONS_RUNNER_DEBUG
36    match std::env::var("ACTIONS_RUNNER_DEBUG") {
37        Ok(_value) => return log::LevelFilter::Debug,
38        Err(_err) => (),
39    };
40
41    log::LevelFilter::Info
42}
43
44/// Group Macro
45#[macro_export]
46macro_rules! group {
47    // group!()
48    ($($arg:tt)*) => {
49        let title = format!($($arg)*);
50        if std::env::var("CI").is_ok() {
51            println!("::group::{}", title)
52        } else {
53            log!(log::Level::Info, "{}", title)
54        }
55    };
56}
57
58#[macro_export]
59macro_rules! group_info {
60    // group_info!()
61    ($($arg:tt)*) => {
62        let title = format!($($arg)*);
63        if std::env::var("CI").is_ok() {
64            println!("{}", title)
65        } else {
66            log!(log::Level::Info, "{}", title)
67        }
68    };
69}
70
71#[macro_export]
72macro_rules! group_error {
73    // group_info!()
74    ($($arg:tt)*) => {
75        let title = format!($($arg)*);
76        if std::env::var("CI").is_ok() {
77            eprintln!("{}", title)
78        } else {
79            log!(log::Level::Error, "{}", title)
80        }
81    };
82}
83
84/// End Group Macro
85#[macro_export]
86macro_rules! endgroup {
87    // endgroup!()
88    () => {
89        if std::env::var("CI").is_ok() {
90            println!("::endgroup::")
91        }
92    };
93}