atcoder_auto_tester/
message.rs1use 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}