blob: 37abc3b197100e1ccc55d27c3ae18c505c31168b [file] [log] [blame]
//! A terminal cursor related ANSI escape sequences.
sequence!(
/// Saves the cursor position.
///
/// Use the [`RestoreCursorPosition`](struct.RestoreCursorPosition.html) sequence to
/// restore the cursor position.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::{SaveCursorPosition, RestoreCursorPosition};
///
/// let mut stdout = stdout();
/// // Save cursor position
/// write!(stdout, "{}", SaveCursorPosition);
///
/// // Your app
///
/// // Restore cursor position
/// write!(stdout, "{}", RestoreCursorPosition);
/// ```
struct SaveCursorPosition => esc!("7")
);
sequence!(
/// Restores the cursor position.
///
/// Use the [`SaveCursorPosition`](struct.SaveCursorPosition.html) sequence to
/// save the cursor position.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::{SaveCursorPosition, RestoreCursorPosition};
///
/// let mut stdout = stdout();
/// // Save cursor position
/// write!(stdout, "{}", SaveCursorPosition);
///
/// // Your app
///
/// // Restore cursor position
/// write!(stdout, "{}", RestoreCursorPosition);
/// ```
struct RestoreCursorPosition => esc!("8")
);
sequence!(
/// Hides the cursor.
///
/// Use the [`ShowCursor`](struct.ShowCursor.html) sequence to show the cursor.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::HideCursor;
///
/// let mut stdout = stdout();
/// // Hide cursor
/// write!(stdout, "{}", HideCursor);
/// ```
struct HideCursor => csi!("?25l")
);
sequence!(
/// Shows the cursor.
///
/// Use the [`HideCursor`](struct.HideCursor.html) sequence to hide the cursor.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::ShowCursor;
///
/// let mut stdout = stdout();
/// // Show cursor
/// write!(stdout, "{}", ShowCursor);
/// ```
struct ShowCursor => csi!("?25h")
);
sequence!(
/// Enables the cursor blinking.
///
/// Use the [`DisableCursorBlinking`](struct.DisableCursorBlinking.html) sequence to disable
/// cursor blinking.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::EnableCursorBlinking;
///
/// let mut stdout = stdout();
/// // Enable cursor blinking
/// write!(stdout, "{}", EnableCursorBlinking);
/// ```
struct EnableCursorBlinking => csi!("?12h")
);
sequence!(
/// Disables the cursor blinking.
///
/// Use the [`EnableCursorBlinking`](struct.EnableCursorBlinking.html) sequence to enable
/// cursor blinking.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::DisableCursorBlinking;
///
/// let mut stdout = stdout();
/// // Disable cursor blinking
/// write!(stdout, "{}", DisableCursorBlinking);
/// ```
struct DisableCursorBlinking => csi!("?12l")
);
sequence!(
/// Moves the cursor to the given location (column, row).
///
/// # Notes
///
/// Top/left cell is represented as `1, 1` (`column, row`).
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorTo;
///
/// let mut stdout = stdout();
/// // Move cursor to top left cell
/// write!(stdout, "{}", MoveCursorTo(1, 1));
/// ```
struct MoveCursorTo(u16, u16) =>
|this, f| write!(f, csi!("{};{}H"), this.1, this.0)
);
sequence!(
/// Moves the cursor up by the given number of rows.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorUp;
///
/// let mut stdout = stdout();
/// // Move cursor up by 5 rows
/// write!(stdout, "{}", MoveCursorUp(5));
/// ```
struct MoveCursorUp(u16) =>
|this, f| write!(f, csi!("{}A"), this.0)
);
sequence!(
/// Moves the cursor down by the given number of rows.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorDown;
///
/// let mut stdout = stdout();
/// // Move cursor down by 5 rows
/// write!(stdout, "{}", MoveCursorDown(5));
/// ```
struct MoveCursorDown(u16) =>
|this, f| write!(f, csi!("{}B"), this.0)
);
sequence!(
/// Moves the cursor right by the given number of columns.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorRight;
///
/// let mut stdout = stdout();
/// // Move cursor right by 5 columns
/// write!(stdout, "{}", MoveCursorRight(5));
/// ```
struct MoveCursorRight(u16) =>
|this, f| write!(f, csi!("{}C"), this.0)
);
sequence!(
/// Moves the cursor left by the given number of columns.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorLeft;
///
/// let mut stdout = stdout();
/// // Move cursor left by 5 columns
/// write!(stdout, "{}", MoveCursorLeft(5));
/// ```
struct MoveCursorLeft(u16) =>
|this, f| write!(f, csi!("{}D"), this.0)
);
sequence!(
/// Moves the cursor to beginning of line the given number of lines down.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorToNextLine;
///
/// let mut stdout = stdout();
/// // Move cursor down by 2 rows and the move it to the first column
/// write!(stdout, "{}", MoveCursorToNextLine(2));
/// ```
///
/// The previous example does the same thing as the following one:
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::{MoveCursorDown, MoveCursorToColumn};
///
/// let mut stdout = stdout();
/// write!(stdout, "{}{}", MoveCursorDown(2), MoveCursorToColumn(1));
/// ```
struct MoveCursorToNextLine(u16) =>
|this, f| write!(f, csi!("{}E"), this.0)
);
sequence!(
/// Moves the cursor to beginning of line the given number of lines up.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorToPreviousLine;
///
/// let mut stdout = stdout();
/// // Move cursor up by 2 rows and the move it to the first column
/// write!(stdout, "{}", MoveCursorToPreviousLine(2));
/// ```
///
/// The previous example does the same thing as the following one:
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::{MoveCursorUp, MoveCursorToColumn};
///
/// let mut stdout = stdout();
/// write!(stdout, "{}{}", MoveCursorUp(2), MoveCursorToColumn(1));
/// ```
struct MoveCursorToPreviousLine(u16) =>
|this, f| write!(f, csi!("{}F"), this.0)
);
sequence!(
/// Moves the cursor to the given column.
///
/// # Notes
///
/// Beginning of the line (left cell) is represented as `1`.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::MoveCursorToColumn;
///
/// let mut stdout = stdout();
/// // Move cursor to the 10th column (same row)
/// write!(stdout, "{}", MoveCursorToColumn(10));
/// ```
struct MoveCursorToColumn(u16) =>
|this, f| write!(f, csi!("{}G"), this.0)
);
// TODO Enhance example with Parser to show how to retrieve it
sequence!(
/// Asks for the current cursor position.
///
/// # Examples
///
/// ```no_run
/// use std::io::{stdout, Write};
/// use anes::ReportCursorPosition;
///
/// let mut stdout = stdout();
/// write!(stdout, "{}", ReportCursorPosition);
/// ```
struct ReportCursorPosition => csi!("6n")
);
#[cfg(test)]
test_sequences!(
save_cursor_position(
SaveCursorPosition => "\x1B7",
),
restore_cursor_position(
RestoreCursorPosition => "\x1B8",
),
hide_cursor(
HideCursor => "\x1B[?25l",
),
show_cursor(
ShowCursor => "\x1B[?25h",
),
disable_cursor_blinking(
DisableCursorBlinking => "\x1B[?12l",
),
enable_cursor_blinking(
EnableCursorBlinking => "\x1B[?12h",
),
move_cursor_up(
MoveCursorUp(10) => "\x1B[10A",
),
move_cursor_down(
MoveCursorDown(10) => "\x1B[10B",
),
move_cursor_right(
MoveCursorRight(10) => "\x1B[10C",
),
move_cursor_left(
MoveCursorLeft(10) => "\x1B[10D",
),
move_cursor_to(
MoveCursorTo(5, 10) => "\x1B[10;5H",
),
move_cursor_to_next_line(
MoveCursorToNextLine(5) => "\x1B[5E",
),
move_cursor_to_previous_line(
MoveCursorToPreviousLine(5) => "\x1B[5F",
),
move_cursor_to_column(
MoveCursorToColumn(1) => "\x1B[1G",
),
report_cursor_position(
ReportCursorPosition => "\x1B[6n",
)
);