1 use std::fmt;
2 
3 sequence!(
4     /// Resets all attributes.
5     ///
6     /// This sequence resets all attributes previously set by the:
7     ///
8     /// * [`SetAttribute`](struct.SetAttribute.html)
9     /// * [`SetForegroundColor`](struct.SetBackgroundColor.html)
10     /// * [`SetBackgroundColor`](struct.SetForegroundColor.html)
11     ///
12     /// # Examples
13     ///
14     /// ```no_run
15     /// use std::io::{stdout, Write};
16     /// use anes::ResetAttributes;
17     ///
18     /// let mut stdout = stdout();
19     /// write!(stdout, "{}", ResetAttributes);
20     /// ```
21     struct ResetAttributes => sgr!("0")
22 );
23 
24 /// A display attribute.
25 ///
26 /// This is **NOT** a full ANSI sequence. `Attribute` must be used along with
27 /// the [`SetAttribute`](struct.SetAttribute.html).
28 ///
29 /// # Examples
30 ///
31 /// ```no_run
32 /// use std::io::{stdout, Write};
33 /// use anes::{Attribute, SetAttribute};
34 ///
35 /// let mut stdout = stdout();
36 /// write!(stdout, "{}Bold text", SetAttribute(Attribute::Bold));
37 /// ```
38 #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
39 pub enum Attribute {
40     /// Bold (increased) intensity.
41     Bold = 1,
42     /// Faint (decreased) intensity.
43     Faint = 2,
44     /// Normal intensity (turns off `Bold` and/or `Faint`).
45     Normal = 22,
46 
47     /// Italic.
48     Italic = 3,
49     /// Turns off `Italic`.
50     ItalicOff = 23,
51 
52     /// Underlined text.
53     Underline = 4,
54     /// Turns off `Underline`.
55     UnderlineOff = 24,
56 
57     /// Blinking text.
58     Blink = 5,
59     /// Turns off blinking text (`Blink`).
60     BlinkOff = 25,
61 
62     /// Reverse foreground & background colors.
63     Reverse = 7,
64     /// Turns off `Reverse`.
65     ReverseOff = 27,
66 
67     /// Concealed (hidden).
68     Conceal = 8,
69     /// Turns off `Conceal`.
70     ConcealOff = 28,
71 
72     /// Crossed.
73     Crossed = 9,
74     /// Turns off `Crossed`.
75     CrossedOff = 29,
76 }
77 
78 impl fmt::Display for Attribute {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result79     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80         write!(f, "{}", *self as i32)
81     }
82 }
83 
84 sequence!(
85     /// Sets the display attribute.
86     ///
87     /// See the [`Attribute`](enum.Attribute.html) enum for a list of attributes you can (un)set.
88     ///
89     /// The [`ResetAttributes`](struct.ResetAttributes.html) sequence can be used to turn off all
90     /// attributes.
91     ///
92     /// # Examples
93     ///
94     /// ```no_run
95     /// use std::io::{stdout, Write};
96     /// use anes::{Attribute, SetAttribute};
97     ///
98     /// let mut stdout = stdout();
99     /// write!(stdout, "{}Blinking text", SetAttribute(Attribute::Blink));
100     /// ```
101     struct SetAttribute(Attribute) =>
102     |this, f| write!(f, sgr!("{}"), this.0)
103 );
104 
105 #[cfg(test)]
106 test_sequences!(
107     set_attribute(
108         SetAttribute(Attribute::Bold) => "\x1B[1m",
109         SetAttribute(Attribute::Faint) => "\x1B[2m",
110         SetAttribute(Attribute::Normal) => "\x1B[22m",
111 
112         SetAttribute(Attribute::Italic) => "\x1B[3m",
113         SetAttribute(Attribute::ItalicOff) => "\x1B[23m",
114 
115         SetAttribute(Attribute::Underline) => "\x1B[4m",
116         SetAttribute(Attribute::UnderlineOff) => "\x1B[24m",
117 
118         SetAttribute(Attribute::Blink) => "\x1B[5m",
119         SetAttribute(Attribute::BlinkOff) => "\x1B[25m",
120 
121         SetAttribute(Attribute::Reverse) => "\x1B[7m",
122         SetAttribute(Attribute::ReverseOff) => "\x1B[27m",
123 
124         SetAttribute(Attribute::Conceal) => "\x1B[8m",
125         SetAttribute(Attribute::ConcealOff) => "\x1B[28m",
126 
127         SetAttribute(Attribute::Crossed) => "\x1B[9m",
128         SetAttribute(Attribute::CrossedOff) => "\x1B[29m",
129     ),
130     reset_attributes(
131         ResetAttributes => "\x1B[0m",
132     )
133 );
134