1 sequence!(
2     /// Switches to the alternate buffer.
3     ///
4     /// Use the [`SwitchBufferToNormal`](struct.SwitchBufferToNormal.html) sequence to switch
5     /// back to the normal buffer.
6     ///
7     /// # Examples
8     ///
9     /// ```no_run
10     /// use std::io::{stdout, Write};
11     /// use anes::{SwitchBufferToAlternate, SwitchBufferToNormal};
12     ///
13     /// let mut stdout = stdout();
14     /// write!(stdout, "{}", SwitchBufferToAlternate);
15     /// // Your app on alternate screen
16     /// write!(stdout, "{}", SwitchBufferToNormal);
17     /// ```
18     struct SwitchBufferToAlternate => csi!("?1049h")
19 );
20 
21 sequence!(
22     /// Switches to the normal buffer.
23     ///
24     /// # Examples
25     ///
26     /// ```no_run
27     /// use std::io::{stdout, Write};
28     /// use anes::{SwitchBufferToAlternate, SwitchBufferToNormal};
29     ///
30     /// let mut stdout = stdout();
31     /// write!(stdout, "{}", SwitchBufferToAlternate);
32     /// // Your app on alternate screen
33     /// write!(stdout, "{}", SwitchBufferToNormal);
34     /// ```
35     struct SwitchBufferToNormal => csi!("?1049l")
36 );
37 
38 sequence!(
39     /// Scrolls up by the given number of rows.
40     ///
41     /// # Examples
42     ///
43     /// ```no_run
44     /// use std::io::{stdout, Write};
45     /// use anes::ScrollBufferUp;
46     ///
47     /// let mut stdout = stdout();
48     /// // Scroll up by 5 lines
49     /// write!(stdout, "{}", ScrollBufferUp(5));
50     /// ```
51     struct ScrollBufferUp(u16) =>
52     |this, f| write!(f, csi!("{}S"), this.0)
53 );
54 
55 sequence!(
56     /// Scrolls down by the given number of rows.
57     ///
58     /// # Examples
59     ///
60     /// ```no_run
61     /// use std::io::{stdout, Write};
62     /// use anes::ScrollBufferDown;
63     ///
64     /// let mut stdout = stdout();
65     /// // Scroll down by 10 lines
66     /// write!(stdout, "{}", ScrollBufferDown(10));
67     /// ```
68     struct ScrollBufferDown(u16) =>
69     |this, f| write!(f, csi!("{}T"), this.0)
70 );
71 
72 sequence!(
73     /// Clears part of the line.
74     ///
75     /// # Examples
76     ///
77     /// ```no_run
78     /// use std::io::{stdout, Write};
79     /// use anes::ClearLine;
80     ///
81     /// let mut stdout = stdout();
82     /// // Clear the whole line
83     /// write!(stdout, "{}", ClearLine::All);
84     /// ```
85     enum ClearLine {
86         /// Clears from the cursor position to end of the line.
87         Right => csi!("K"),
88         /// Clears from the cursor position to beginning of the line.
89         Left => csi!("1K"),
90         /// Clears the whole line.
91         All => csi!("2K"),
92     }
93 );
94 
95 sequence!(
96     /// Clears part of the buffer.
97     ///
98     /// # Examples
99     ///
100     /// ```no_run
101     /// use std::io::{stdout, Write};
102     /// use anes::ClearBuffer;
103     ///
104     /// let mut stdout = stdout();
105     /// // Clear the entire buffer
106     /// write!(stdout, "{}", ClearBuffer::All);
107     /// ```
108     enum ClearBuffer {
109         /// Clears from the cursor position to end of the screen.
110         Below => csi!("J"),
111         /// Clears from the cursor position to beginning of the screen.
112         Above => csi!("1J"),
113         /// Clears the entire buffer.
114         All => csi!("2J"),
115         /// Clears the entire buffer and all saved lines in the scrollback buffer.
116         SavedLines => csi!("3J"),
117     }
118 );
119 
120 #[cfg(test)]
121 test_sequences!(
122     switch_buffer_to_alternate(
123         SwitchBufferToAlternate => "\x1B[?1049h",
124     ),
125     switch_buffer_to_main(
126         SwitchBufferToNormal => "\x1B[?1049l",
127     ),
128     scroll_buffer_up(
129         ScrollBufferUp(10) => "\x1B[10S",
130     ),
131     scroll_buffer_down(
132         ScrollBufferDown(10) => "\x1B[10T",
133     ),
134     clear_line(
135         ClearLine::Right => "\x1B[K",
136         ClearLine::Left => "\x1B[1K",
137         ClearLine::All => "\x1B[2K",
138     ),
139     clear_buffer(
140         ClearBuffer::Below => "\x1B[J",
141         ClearBuffer::Above => "\x1B[1J",
142         ClearBuffer::All => "\x1B[2J",
143         ClearBuffer::SavedLines => "\x1B[3J",
144     ),
145 );
146