1use super::concerns::Ansi;
2use super::keys::FromKey;
3use std::str::FromStr;
4
5pub enum Style {
6 Bold,
7 BoldReset,
8
9 Italic,
10 ItalicReset,
11
12 Underline,
13 UnderlineReset,
14
15 Dimmed,
16 DimmedReset,
17
18 Blink,
19 BlinkReset,
20
21 Reverse,
22 ReverseReset,
23
24 Hidden,
25 HiddenReset,
26
27 Strikethrough,
28 StrikethroughReset,
29
30 None,
31}
32
33impl Style {
34 pub fn get_value(&self) -> u8 {
35 match self {
36 Style::Bold => 1,
37 Style::BoldReset => 22,
38
39 Style::Dimmed => 2,
40 Style::DimmedReset => 22,
41
42 Style::Italic => 3,
43 Style::ItalicReset => 23,
44
45 Style::Underline => 4,
46 Style::UnderlineReset => 24,
47
48 Style::Blink => 5,
49 Style::BlinkReset => 25,
50
51 Style::Reverse => 7,
52 Style::ReverseReset => 27,
53
54 Style::Hidden => 8,
55 Style::HiddenReset => 28,
56
57 Style::Strikethrough => 9,
58 Style::StrikethroughReset => 29,
59
60 Style::None => 0,
61 }
62 }
63}
64
65impl<'a> From<&'a str> for Style {
66 fn from(s: &'a str) -> Self {
67 s.parse().unwrap_or(Style::None)
68 }
69}
70
71impl FromStr for Style {
72 type Err = ();
73
74 fn from_str(s: &str) -> Result<Self, Self::Err> {
75 let src = s.to_lowercase();
76
77 match src.as_ref() {
78 "bold" | "b" => Ok(Style::Bold),
79 "/bold" | "/b" => Ok(Style::BoldReset),
80
81 "dimmed" | "d" => Ok(Style::Dimmed),
82 "/dimmed" | "/d" => Ok(Style::DimmedReset),
83
84 "italic" | "i" => Ok(Style::Italic),
85 "/italic" | "/i" => Ok(Style::ItalicReset),
86
87 "underline" | "u" => Ok(Style::Underline),
88 "/underline" | "/u" => Ok(Style::UnderlineReset),
89
90 "blink" | "l" => Ok(Style::Blink),
91 "/blink" | "/l" => Ok(Style::BlinkReset),
92
93 "reverse" | "r" => Ok(Style::Reverse),
94 "/reverse" | "/r" => Ok(Style::ReverseReset),
95
96 "hidden" | "h" => Ok(Style::Hidden),
97 "/hidden" | "/h" => Ok(Style::HiddenReset),
98
99 "strikethrough" | "s" => Ok(Style::Strikethrough),
100 "/strikethrough" | "/s" => Ok(Style::StrikethroughReset),
101
102 _ => Err(()),
103 }
104 }
105}
106
107impl FromKey for Style {
108 fn from_key(key: &str) -> Option<String> {
109 let s = Style::from(key);
110
111 match s {
112 Style::None => None,
113 _ => Some(Ansi::escape(s.get_value())),
114 }
115 }
116}