use crate::adapter::{BuildProgressCallback, BuildProgressEvent};
use crate::cli::ui::Ui;
use clap::ValueEnum;
use std::sync::Arc;
const RECORD_PREFIX: &str = "{\"reason\":";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, ValueEnum)]
pub enum MessageFormat {
#[default]
Human,
Json,
}
impl MessageFormat {
pub fn is_json(self) -> bool {
self == MessageFormat::Json
}
}
pub fn json_progress() -> BuildProgressCallback {
BuildProgressCallback(Arc::new(|event| match event {
BuildProgressEvent::CompilerMessage(text) | BuildProgressEvent::Diagnostic(text) => {
for line in text.lines() {
if line.starts_with(RECORD_PREFIX) {
println!("{line}");
} else {
eprintln!("{line}");
}
}
}
_ => {}
}))
}
pub fn finish_json(outcome: anyhow::Result<(bool, i32)>) -> i32 {
match outcome {
Ok((success, exit_code)) => {
println!("{{\"reason\":\"build-finished\",\"success\":{success}}}");
exit_code
}
Err(err) => {
Ui::report_error(&err);
println!("{{\"reason\":\"build-finished\",\"success\":false}}");
1
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_format_is_human() {
assert_eq!(MessageFormat::default(), MessageFormat::Human);
assert!(!MessageFormat::Human.is_json());
assert!(MessageFormat::Json.is_json());
}
#[test]
fn finish_returns_the_build_exit_code() {
assert_eq!(finish_json(Ok((true, 0))), 0);
assert_eq!(finish_json(Ok((false, 101))), 101);
}
}