use std::io::Write;
use crate::policy::error::{CompileError, PolicyParseError};
use crate::style;
pub fn display_error(err: &anyhow::Error, verbose: bool) {
let mut stderr = std::io::stderr().lock();
let _ = write!(stderr, "{}: {}", style::err_red_bold("error"), err);
let _ = writeln!(stderr);
let chain: Vec<_> = err.chain().skip(1).collect();
if chain.len() == 1 {
let _ = writeln!(
stderr,
" {}",
style::err_dim(&format!("caused by: {}", chain[0]))
);
} else {
for (i, cause) in chain.iter().enumerate() {
let _ = writeln!(
stderr,
" {}",
style::err_dim(&format!("{}: {}", i + 1, cause))
);
}
}
let hint = err.chain().find_map(|cause| {
if let Some(e) = cause.downcast_ref::<PolicyParseError>() {
return e.help();
}
if let Some(e) = cause.downcast_ref::<CompileError>() {
return e.help();
}
None
});
if let Some(hint) = hint {
let _ = writeln!(stderr, "\n {}: {}", style::err_cyan_bold("hint"), hint);
}
if verbose {
let _ = writeln!(stderr, "\nFull error chain:\n{:?}", err);
} else if !chain.is_empty() {
let _ = writeln!(
stderr,
"\n {}",
style::err_dim("run with --verbose for full details")
);
}
}