atcoder_auto_tester/
message.rs

1use colored::*;
2
3#[derive(Debug, Eq, PartialEq)]
4pub enum MessageLevel {
5    Error,
6    Warning,
7    Info,
8    Command,
9}
10
11#[derive(Debug)]
12pub struct Message {
13    level: MessageLevel,
14    text: String,
15}
16
17impl Message {
18    pub fn new(level: MessageLevel, text: &str) -> Message {
19        Message {
20            level,
21            text: String::from(text),
22        }
23    }
24
25    pub fn show(&self) {
26        let msg = match self.level {
27            MessageLevel::Error => format!("{} {}", "[ERROR]".red().bold(), self.text.red()),
28            MessageLevel::Warning => format!("{} {}", "[WARN]".yellow().bold(), self.text.yellow()),
29            MessageLevel::Info => format!("[ {} ]", self.text.normal())
30                .cyan()
31                .bold()
32                .reversed()
33                .to_string(),
34            MessageLevel::Command => format!("$ {}", self.text.normal()).cyan().to_string(),
35        };
36        println!("{}", msg);
37    }
38}
39
40pub trait Messageable {
41    fn error_message(&self) -> Message;
42    fn warning_message(&self) -> Message;
43    fn info_message(&self) -> Message;
44    fn command_message(&self) -> Message;
45}
46
47impl Messageable for &str {
48    fn error_message(&self) -> Message {
49        Message::new(MessageLevel::Error, self)
50    }
51
52    fn warning_message(&self) -> Message {
53        Message::new(MessageLevel::Warning, self)
54    }
55
56    fn info_message(&self) -> Message {
57        Message::new(MessageLevel::Info, self)
58    }
59
60    fn command_message(&self) -> Message {
61        Message::new(MessageLevel::Command, self)
62    }
63}
64
65impl Messageable for String {
66    fn error_message(&self) -> Message {
67        Message::new(MessageLevel::Error, &self)
68    }
69
70    fn warning_message(&self) -> Message {
71        Message::new(MessageLevel::Warning, &self)
72    }
73
74    fn info_message(&self) -> Message {
75        Message::new(MessageLevel::Info, &self)
76    }
77
78    fn command_message(&self) -> Message {
79        Message::new(MessageLevel::Command, &self)
80    }
81}