atcoder_auto_tester/
error.rs1use std::any::type_name;
2use std::error;
3use std::process;
4
5use crate::message::Messageable;
6
7pub trait ErrorHandleable<T> {
8 fn handle_error(self, msg: &str) -> T;
9}
10
11impl<T, E: error::Error> ErrorHandleable<T> for Result<T, E> {
12 fn handle_error(self, msg: &str) -> T {
13 self.unwrap_or_else(|e| ErrorHandler::handle(e, msg))
14 }
15}
16
17struct ErrorHandler;
18
19impl ErrorHandler {
20 pub fn handle<E: error::Error>(err: E, msg: &str) -> ! {
21 format!("{}: {}", type_name::<E>(), err)
22 .trim()
23 .warning_message()
24 .show();
25 msg.error_message().show();
26 process::exit(1)
27 }
28}