use console::Style as TextStyle;
use std::{
collections::{
HashMap,
HashSet,
},
io::Write,
process::exit,
};
use crate::types::{
log,
Error,
Error_,
};
pub fn err(message: impl ToString) -> Error {
return Error(Box::new(Error_ {
message: message.to_string(),
attrs: HashMap::new(),
context: vec![],
causes: vec![],
incidental: vec![],
}));
}
pub fn err_with(message: impl ToString, attrs: impl Fn(&mut HashMap<&'static str, String>) -> ()) -> Error {
let mut new_attrs = HashMap::new();
attrs(&mut new_attrs);
return Error(Box::new(Error_ {
message: message.to_string(),
attrs: new_attrs,
context: vec![],
causes: vec![],
incidental: vec![],
}));
}
pub fn agg_err(message: impl ToString, errs: Vec<Error>) -> Error {
return Error(Box::new(Error_ {
message: message.to_string(),
attrs: HashMap::new(),
context: vec![],
causes: errs,
incidental: vec![],
}));
}
pub fn agg_err_with(
message: impl ToString,
errs: Vec<Error>,
attrs: impl Fn(&mut HashMap<&'static str, String>) -> (),
) -> Error {
let mut new_attrs = HashMap::new();
attrs(&mut new_attrs);
return Error(Box::new(Error_ {
message: message.to_string(),
attrs: new_attrs,
context: vec![],
causes: errs,
incidental: vec![],
}));
}
pub fn fatal(e: Error) -> ! {
let body_color = TextStyle::new().for_stderr().red();
let level_color = TextStyle::new().for_stderr().red().bold();
let mut node = e.build_render_nodes(&HashSet::new());
node.title = format!("Exiting due to error: {}", node.title).into();
log(body_color, level_color, "FATAL", node);
_ = std::io::stderr().flush();
exit(1)
}