atcoder_auto_tester/
error.rs

1use 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}