1use crate::Ansi;
22
23#[derive(Copy, Clone)]
25pub enum Style {
26 Dim,
27 Reverse,
28 Invisible,
29 Bold,
30 Italic,
31 Underline,
32 Blinking,
33 Strike,
34 Reset,
35 NoDim,
36 NoReverse,
37 NoInvisible,
38 NoBold,
39 NoItalic,
40 NoUnderline,
41 NoBlinking,
42 NoStrike,
43}
44
45use Style::*;
46
47fn derive_style(style: Style) -> &'static str {
48 match style {
49 Dim => "\u{001b}[2m",
50 Reverse => "\u{001b}[7m",
51 Invisible => "\u{001b}[8m",
52 Bold => "\u{001b}[1m",
53 Italic => "\u{001b}[3m",
54 Underline => "\u{001b}[4m",
55 Blinking => "\u{001b}[5m",
56 Strike => "\u{001b}[9m",
57 Reset => "\u{001b}[0m",
58 NoDim => "\u{001b}[22m",
59 NoReverse => "\u{001b}[27m",
60 NoInvisible => "\u{001b}[28m",
61 NoBold => "\u{001b}[22m",
62 NoItalic => "\u{001b}[23m",
63 NoUnderline => "\u{001b}[24m",
64 NoBlinking => "\u{001b}[25m",
65 NoStrike => "\u{001b}[29m",
66 }
67}
68
69pub fn set(style: Style) -> Ansi {
71 Ansi::from_str(derive_style(style).to_string())
72}
73
74#[cfg(test)]
75mod tests {
76 use crate::style::set;
77 use crate::style::Style::{Bold, Italic, Reset, Strike};
78
79 #[test]
80 fn test_styling() {
81 let bold = Bold;
82 let italic = Italic;
83 let strike = Strike;
84
85 println!(
86 "{}I am writing in Bold!{} Now regular!",
87 set(bold),
88 set(Reset)
89 );
90
91 println!(
92 "{}I am writing in Italic!{} Now regular!",
93 set(italic),
94 set(Reset)
95 );
96
97 println!(
98 "{}I am writing in Strike!{} Now regular!",
99 set(strike),
100 set(Reset)
101 );
102 assert_eq!(1, 1);
103 }
104}