summaryrefslogtreecommitdiffstats
path: root/vendor/ansi_term/src
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
commitc23a457e72abe608715ac76f076f47dc42af07a5 (patch)
tree2772049aaf84b5c9d0ed12ec8d86812f7a7904b6 /vendor/ansi_term/src
parentReleasing progress-linux version 1.73.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-c23a457e72abe608715ac76f076f47dc42af07a5.tar.xz
rustc-c23a457e72abe608715ac76f076f47dc42af07a5.zip
Merging upstream version 1.74.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/ansi_term/src')
-rw-r--r--vendor/ansi_term/src/ansi.rs374
-rw-r--r--vendor/ansi_term/src/debug.rs134
-rw-r--r--vendor/ansi_term/src/difference.rs179
-rw-r--r--vendor/ansi_term/src/display.rs296
-rw-r--r--vendor/ansi_term/src/lib.rs271
-rw-r--r--vendor/ansi_term/src/style.rs521
-rw-r--r--vendor/ansi_term/src/util.rs81
-rw-r--r--vendor/ansi_term/src/windows.rs61
-rw-r--r--vendor/ansi_term/src/write.rs40
9 files changed, 1957 insertions, 0 deletions
diff --git a/vendor/ansi_term/src/ansi.rs b/vendor/ansi_term/src/ansi.rs
new file mode 100644
index 000000000..aaf215234
--- /dev/null
+++ b/vendor/ansi_term/src/ansi.rs
@@ -0,0 +1,374 @@
+use style::{Colour, Style};
+
+use std::fmt;
+
+use write::AnyWrite;
+
+
+// ---- generating ANSI codes ----
+
+impl Style {
+
+ /// Write any bytes that go *before* a piece of text to the given writer.
+ fn write_prefix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+
+ // If there are actually no styles here, then don’t write *any* codes
+ // as the prefix. An empty ANSI code may not affect the terminal
+ // output at all, but a user may just want a code-free string.
+ if self.is_plain() {
+ return Ok(());
+ }
+
+ // Write the codes’ prefix, then write numbers, separated by
+ // semicolons, for each text style we want to apply.
+ write!(f, "\x1B[")?;
+ let mut written_anything = false;
+
+ {
+ let mut write_char = |c| {
+ if written_anything { write!(f, ";")?; }
+ written_anything = true;
+ write!(f, "{}", c)?;
+ Ok(())
+ };
+
+ if self.is_bold { write_char('1')? }
+ if self.is_dimmed { write_char('2')? }
+ if self.is_italic { write_char('3')? }
+ if self.is_underline { write_char('4')? }
+ if self.is_blink { write_char('5')? }
+ if self.is_reverse { write_char('7')? }
+ if self.is_hidden { write_char('8')? }
+ if self.is_strikethrough { write_char('9')? }
+ }
+
+ // The foreground and background colours, if specified, need to be
+ // handled specially because the number codes are more complicated.
+ // (see `write_background_code` and `write_foreground_code`)
+ if let Some(bg) = self.background {
+ if written_anything { write!(f, ";")?; }
+ written_anything = true;
+ bg.write_background_code(f)?;
+ }
+
+ if let Some(fg) = self.foreground {
+ if written_anything { write!(f, ";")?; }
+ fg.write_foreground_code(f)?;
+ }
+
+ // All the codes end with an `m`, because reasons.
+ write!(f, "m")?;
+
+ Ok(())
+ }
+
+ /// Write any bytes that go *after* a piece of text to the given writer.
+ fn write_suffix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+ if self.is_plain() {
+ Ok(())
+ }
+ else {
+ write!(f, "{}", RESET)
+ }
+ }
+}
+
+
+/// The code to send to reset all styles and return to `Style::default()`.
+pub static RESET: &str = "\x1B[0m";
+
+
+
+impl Colour {
+ fn write_foreground_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+ match *self {
+ Colour::Black => write!(f, "30"),
+ Colour::Red => write!(f, "31"),
+ Colour::Green => write!(f, "32"),
+ Colour::Yellow => write!(f, "33"),
+ Colour::Blue => write!(f, "34"),
+ Colour::Purple => write!(f, "35"),
+ Colour::Cyan => write!(f, "36"),
+ Colour::White => write!(f, "37"),
+ Colour::Fixed(num) => write!(f, "38;5;{}", &num),
+ Colour::RGB(r,g,b) => write!(f, "38;2;{};{};{}", &r, &g, &b),
+ }
+ }
+
+ fn write_background_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+ match *self {
+ Colour::Black => write!(f, "40"),
+ Colour::Red => write!(f, "41"),
+ Colour::Green => write!(f, "42"),
+ Colour::Yellow => write!(f, "43"),
+ Colour::Blue => write!(f, "44"),
+ Colour::Purple => write!(f, "45"),
+ Colour::Cyan => write!(f, "46"),
+ Colour::White => write!(f, "47"),
+ Colour::Fixed(num) => write!(f, "48;5;{}", &num),
+ Colour::RGB(r,g,b) => write!(f, "48;2;{};{};{}", &r, &g, &b),
+ }
+ }
+}
+
+
+/// Like `ANSIString`, but only displays the style prefix.
+///
+/// This type implements the `Display` trait, meaning it can be written to a
+/// `std::fmt` formatting without doing any extra allocation, and written to a
+/// string with the `.to_string()` method. For examples, see
+/// [`Style::prefix`](struct.Style.html#method.prefix).
+#[derive(Clone, Copy, Debug)]
+pub struct Prefix(Style);
+
+/// Like `ANSIString`, but only displays the difference between two
+/// styles.
+///
+/// This type implements the `Display` trait, meaning it can be written to a
+/// `std::fmt` formatting without doing any extra allocation, and written to a
+/// string with the `.to_string()` method. For examples, see
+/// [`Style::infix`](struct.Style.html#method.infix).
+#[derive(Clone, Copy, Debug)]
+pub struct Infix(Style, Style);
+
+/// Like `ANSIString`, but only displays the style suffix.
+///
+/// This type implements the `Display` trait, meaning it can be written to a
+/// `std::fmt` formatting without doing any extra allocation, and written to a
+/// string with the `.to_string()` method. For examples, see
+/// [`Style::suffix`](struct.Style.html#method.suffix).
+#[derive(Clone, Copy, Debug)]
+pub struct Suffix(Style);
+
+
+impl Style {
+
+ /// The prefix bytes for this style. These are the bytes that tell the
+ /// terminal to use a different colour or font style.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour::Blue};
+ ///
+ /// let style = Style::default().bold();
+ /// assert_eq!("\x1b[1m",
+ /// style.prefix().to_string());
+ ///
+ /// let style = Blue.bold();
+ /// assert_eq!("\x1b[1;34m",
+ /// style.prefix().to_string());
+ ///
+ /// let style = Style::default();
+ /// assert_eq!("",
+ /// style.prefix().to_string());
+ /// ```
+ pub fn prefix(self) -> Prefix {
+ Prefix(self)
+ }
+
+ /// The infix bytes between this style and `next` style. These are the bytes
+ /// that tell the terminal to change the style to `next`. These may include
+ /// a reset followed by the next colour and style, depending on the two styles.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour::Green};
+ ///
+ /// let style = Style::default().bold();
+ /// assert_eq!("\x1b[32m",
+ /// style.infix(Green.bold()).to_string());
+ ///
+ /// let style = Green.normal();
+ /// assert_eq!("\x1b[1m",
+ /// style.infix(Green.bold()).to_string());
+ ///
+ /// let style = Style::default();
+ /// assert_eq!("",
+ /// style.infix(style).to_string());
+ /// ```
+ pub fn infix(self, next: Style) -> Infix {
+ Infix(self, next)
+ }
+
+ /// The suffix for this style. These are the bytes that tell the terminal
+ /// to reset back to its normal colour and font style.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour::Green};
+ ///
+ /// let style = Style::default().bold();
+ /// assert_eq!("\x1b[0m",
+ /// style.suffix().to_string());
+ ///
+ /// let style = Green.normal().bold();
+ /// assert_eq!("\x1b[0m",
+ /// style.suffix().to_string());
+ ///
+ /// let style = Style::default();
+ /// assert_eq!("",
+ /// style.suffix().to_string());
+ /// ```
+ pub fn suffix(self) -> Suffix {
+ Suffix(self)
+ }
+}
+
+
+impl Colour {
+
+ /// The prefix bytes for this colour as a `Style`. These are the bytes
+ /// that tell the terminal to use a different colour or font style.
+ ///
+ /// See also [`Style::prefix`](struct.Style.html#method.prefix).
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour::Green;
+ ///
+ /// assert_eq!("\x1b[0m",
+ /// Green.suffix().to_string());
+ /// ```
+ pub fn prefix(self) -> Prefix {
+ Prefix(self.normal())
+ }
+
+ /// The infix bytes between this colour and `next` colour. These are the bytes
+ /// that tell the terminal to use the `next` colour, or to do nothing if
+ /// the two colours are equal.
+ ///
+ /// See also [`Style::infix`](struct.Style.html#method.infix).
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour::{Red, Yellow};
+ ///
+ /// assert_eq!("\x1b[33m",
+ /// Red.infix(Yellow).to_string());
+ /// ```
+ pub fn infix(self, next: Colour) -> Infix {
+ Infix(self.normal(), next.normal())
+ }
+
+ /// The suffix for this colour as a `Style`. These are the bytes that
+ /// tell the terminal to reset back to its normal colour and font style.
+ ///
+ /// See also [`Style::suffix`](struct.Style.html#method.suffix).
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour::Purple;
+ ///
+ /// assert_eq!("\x1b[0m",
+ /// Purple.suffix().to_string());
+ /// ```
+ pub fn suffix(self) -> Suffix {
+ Suffix(self.normal())
+ }
+}
+
+
+impl fmt::Display for Prefix {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let f: &mut fmt::Write = f;
+ self.0.write_prefix(f)
+ }
+}
+
+
+impl fmt::Display for Infix {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ use difference::Difference;
+
+ match Difference::between(&self.0, &self.1) {
+ Difference::ExtraStyles(style) => {
+ let f: &mut fmt::Write = f;
+ style.write_prefix(f)
+ },
+ Difference::Reset => {
+ let f: &mut fmt::Write = f;
+ write!(f, "{}{}", RESET, self.1.prefix())
+ },
+ Difference::NoDifference => {
+ Ok(()) // nothing to write
+ },
+ }
+ }
+}
+
+
+impl fmt::Display for Suffix {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let f: &mut fmt::Write = f;
+ self.0.write_suffix(f)
+ }
+}
+
+
+
+#[cfg(test)]
+mod test {
+ use style::Style;
+ use style::Colour::*;
+
+ macro_rules! test {
+ ($name: ident: $style: expr; $input: expr => $result: expr) => {
+ #[test]
+ fn $name() {
+ assert_eq!($style.paint($input).to_string(), $result.to_string());
+
+ let mut v = Vec::new();
+ $style.paint($input.as_bytes()).write_to(&mut v).unwrap();
+ assert_eq!(v.as_slice(), $result.as_bytes());
+ }
+ };
+ }
+
+ test!(plain: Style::default(); "text/plain" => "text/plain");
+ test!(red: Red; "hi" => "\x1B[31mhi\x1B[0m");
+ test!(black: Black.normal(); "hi" => "\x1B[30mhi\x1B[0m");
+ test!(yellow_bold: Yellow.bold(); "hi" => "\x1B[1;33mhi\x1B[0m");
+ test!(yellow_bold_2: Yellow.normal().bold(); "hi" => "\x1B[1;33mhi\x1B[0m");
+ test!(blue_underline: Blue.underline(); "hi" => "\x1B[4;34mhi\x1B[0m");
+ test!(green_bold_ul: Green.bold().underline(); "hi" => "\x1B[1;4;32mhi\x1B[0m");
+ test!(green_bold_ul_2: Green.underline().bold(); "hi" => "\x1B[1;4;32mhi\x1B[0m");
+ test!(purple_on_white: Purple.on(White); "hi" => "\x1B[47;35mhi\x1B[0m");
+ test!(purple_on_white_2: Purple.normal().on(White); "hi" => "\x1B[47;35mhi\x1B[0m");
+ test!(yellow_on_blue: Style::new().on(Blue).fg(Yellow); "hi" => "\x1B[44;33mhi\x1B[0m");
+ test!(yellow_on_blue_2: Cyan.on(Blue).fg(Yellow); "hi" => "\x1B[44;33mhi\x1B[0m");
+ test!(cyan_bold_on_white: Cyan.bold().on(White); "hi" => "\x1B[1;47;36mhi\x1B[0m");
+ test!(cyan_ul_on_white: Cyan.underline().on(White); "hi" => "\x1B[4;47;36mhi\x1B[0m");
+ test!(cyan_bold_ul_on_white: Cyan.bold().underline().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
+ test!(cyan_ul_bold_on_white: Cyan.underline().bold().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
+ test!(fixed: Fixed(100); "hi" => "\x1B[38;5;100mhi\x1B[0m");
+ test!(fixed_on_purple: Fixed(100).on(Purple); "hi" => "\x1B[45;38;5;100mhi\x1B[0m");
+ test!(fixed_on_fixed: Fixed(100).on(Fixed(200)); "hi" => "\x1B[48;5;200;38;5;100mhi\x1B[0m");
+ test!(rgb: RGB(70,130,180); "hi" => "\x1B[38;2;70;130;180mhi\x1B[0m");
+ test!(rgb_on_blue: RGB(70,130,180).on(Blue); "hi" => "\x1B[44;38;2;70;130;180mhi\x1B[0m");
+ test!(blue_on_rgb: Blue.on(RGB(70,130,180)); "hi" => "\x1B[48;2;70;130;180;34mhi\x1B[0m");
+ test!(rgb_on_rgb: RGB(70,130,180).on(RGB(5,10,15)); "hi" => "\x1B[48;2;5;10;15;38;2;70;130;180mhi\x1B[0m");
+ test!(bold: Style::new().bold(); "hi" => "\x1B[1mhi\x1B[0m");
+ test!(underline: Style::new().underline(); "hi" => "\x1B[4mhi\x1B[0m");
+ test!(bunderline: Style::new().bold().underline(); "hi" => "\x1B[1;4mhi\x1B[0m");
+ test!(dimmed: Style::new().dimmed(); "hi" => "\x1B[2mhi\x1B[0m");
+ test!(italic: Style::new().italic(); "hi" => "\x1B[3mhi\x1B[0m");
+ test!(blink: Style::new().blink(); "hi" => "\x1B[5mhi\x1B[0m");
+ test!(reverse: Style::new().reverse(); "hi" => "\x1B[7mhi\x1B[0m");
+ test!(hidden: Style::new().hidden(); "hi" => "\x1B[8mhi\x1B[0m");
+ test!(stricken: Style::new().strikethrough(); "hi" => "\x1B[9mhi\x1B[0m");
+
+ #[test]
+ fn test_infix() {
+ assert_eq!(Style::new().dimmed().infix(Style::new()).to_string(), "\x1B[0m");
+ assert_eq!(White.dimmed().infix(White.normal()).to_string(), "\x1B[0m\x1B[37m");
+ assert_eq!(White.normal().infix(White.bold()).to_string(), "\x1B[1m");
+ assert_eq!(White.normal().infix(Blue.normal()).to_string(), "\x1B[34m");
+ assert_eq!(Blue.bold().infix(Blue.bold()).to_string(), "");
+ }
+}
diff --git a/vendor/ansi_term/src/debug.rs b/vendor/ansi_term/src/debug.rs
new file mode 100644
index 000000000..4877323ff
--- /dev/null
+++ b/vendor/ansi_term/src/debug.rs
@@ -0,0 +1,134 @@
+use std::fmt;
+
+use style::Style;
+
+/// Styles have a special `Debug` implementation that only shows the fields that
+/// are set. Fields that haven’t been touched aren’t included in the output.
+///
+/// This behaviour gets bypassed when using the alternate formatting mode
+/// `format!("{:#?}")`.
+///
+/// use ansi_term::Colour::{Red, Blue};
+/// assert_eq!("Style { fg(Red), on(Blue), bold, italic }",
+/// format!("{:?}", Red.on(Blue).bold().italic()));
+impl fmt::Debug for Style {
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+ if fmt.alternate() {
+ fmt.debug_struct("Style")
+ .field("foreground", &self.foreground)
+ .field("background", &self.background)
+ .field("blink", &self.is_blink)
+ .field("bold", &self.is_bold)
+ .field("dimmed", &self.is_dimmed)
+ .field("hidden", &self.is_hidden)
+ .field("italic", &self.is_italic)
+ .field("reverse", &self.is_reverse)
+ .field("strikethrough", &self.is_strikethrough)
+ .field("underline", &self.is_underline)
+ .finish()
+ }
+ else if self.is_plain() {
+ fmt.write_str("Style {}")
+ }
+ else {
+ fmt.write_str("Style { ")?;
+
+ let mut written_anything = false;
+
+ if let Some(fg) = self.foreground {
+ if written_anything { fmt.write_str(", ")? }
+ written_anything = true;
+ write!(fmt, "fg({:?})", fg)?
+ }
+
+ if let Some(bg) = self.background {
+ if written_anything { fmt.write_str(", ")? }
+ written_anything = true;
+ write!(fmt, "on({:?})", bg)?
+ }
+
+ {
+ let mut write_flag = |name| {
+ if written_anything { fmt.write_str(", ")? }
+ written_anything = true;
+ fmt.write_str(name)
+ };
+
+ if self.is_blink { write_flag("blink")? }
+ if self.is_bold { write_flag("bold")? }
+ if self.is_dimmed { write_flag("dimmed")? }
+ if self.is_hidden { write_flag("hidden")? }
+ if self.is_italic { write_flag("italic")? }
+ if self.is_reverse { write_flag("reverse")? }
+ if self.is_strikethrough { write_flag("strikethrough")? }
+ if self.is_underline { write_flag("underline")? }
+ }
+
+ write!(fmt, " }}")
+ }
+ }
+}
+
+
+#[cfg(test)]
+mod test {
+ use style::Colour::*;
+ use style::Style;
+
+ fn style() -> Style {
+ Style::new()
+ }
+
+ macro_rules! test {
+ ($name: ident: $obj: expr => $result: expr) => {
+ #[test]
+ fn $name() {
+ assert_eq!($result, format!("{:?}", $obj));
+ }
+ };
+ }
+
+ test!(empty: style() => "Style {}");
+ test!(bold: style().bold() => "Style { bold }");
+ test!(italic: style().italic() => "Style { italic }");
+ test!(both: style().bold().italic() => "Style { bold, italic }");
+
+ test!(red: Red.normal() => "Style { fg(Red) }");
+ test!(redblue: Red.normal().on(RGB(3, 2, 4)) => "Style { fg(Red), on(RGB(3, 2, 4)) }");
+
+ test!(everything:
+ Red.on(Blue).blink().bold().dimmed().hidden().italic().reverse().strikethrough().underline() =>
+ "Style { fg(Red), on(Blue), blink, bold, dimmed, hidden, italic, reverse, strikethrough, underline }");
+
+ #[test]
+ fn long_and_detailed() {
+ extern crate regex;
+ let expected_debug = "Style { fg(Blue), bold }";
+ let expected_pretty_repat = r##"(?x)
+ Style\s+\{\s+
+ foreground:\s+Some\(\s+
+ Blue,?\s+
+ \),\s+
+ background:\s+None,\s+
+ blink:\s+false,\s+
+ bold:\s+true,\s+
+ dimmed:\s+false,\s+
+ hidden:\s+false,\s+
+ italic:\s+false,\s+
+ reverse:\s+false,\s+
+ strikethrough:\s+
+ false,\s+
+ underline:\s+false,?\s+
+ \}"##;
+ let re = regex::Regex::new(expected_pretty_repat).unwrap();
+
+ let style = Blue.bold();
+ let style_fmt_debug = format!("{:?}", style);
+ let style_fmt_pretty = format!("{:#?}", style);
+ println!("style_fmt_debug:\n{}", style_fmt_debug);
+ println!("style_fmt_pretty:\n{}", style_fmt_pretty);
+
+ assert_eq!(expected_debug, style_fmt_debug);
+ assert!(re.is_match(&style_fmt_pretty));
+ }
+}
diff --git a/vendor/ansi_term/src/difference.rs b/vendor/ansi_term/src/difference.rs
new file mode 100644
index 000000000..b0de07f7e
--- /dev/null
+++ b/vendor/ansi_term/src/difference.rs
@@ -0,0 +1,179 @@
+use super::Style;
+
+
+/// When printing out one coloured string followed by another, use one of
+/// these rules to figure out which *extra* control codes need to be sent.
+#[derive(PartialEq, Clone, Copy, Debug)]
+pub enum Difference {
+
+ /// Print out the control codes specified by this style to end up looking
+ /// like the second string's styles.
+ ExtraStyles(Style),
+
+ /// Converting between these two is impossible, so just send a reset
+ /// command and then the second string's styles.
+ Reset,
+
+ /// The before style is exactly the same as the after style, so no further
+ /// control codes need to be printed.
+ NoDifference,
+}
+
+
+impl Difference {
+
+ /// Compute the 'style difference' required to turn an existing style into
+ /// the given, second style.
+ ///
+ /// For example, to turn green text into green bold text, it's redundant
+ /// to write a reset command then a second green+bold command, instead of
+ /// just writing one bold command. This method should see that both styles
+ /// use the foreground colour green, and reduce it to a single command.
+ ///
+ /// This method returns an enum value because it's not actually always
+ /// possible to turn one style into another: for example, text could be
+ /// made bold and underlined, but you can't remove the bold property
+ /// without also removing the underline property. So when this has to
+ /// happen, this function returns None, meaning that the entire set of
+ /// styles should be reset and begun again.
+ pub fn between(first: &Style, next: &Style) -> Difference {
+ use self::Difference::*;
+
+ // XXX(Havvy): This algorithm is kind of hard to replicate without
+ // having the Plain/Foreground enum variants, so I'm just leaving
+ // it commented out for now, and defaulting to Reset.
+
+ if first == next {
+ return NoDifference;
+ }
+
+ // Cannot un-bold, so must Reset.
+ if first.is_bold && !next.is_bold {
+ return Reset;
+ }
+
+ if first.is_dimmed && !next.is_dimmed {
+ return Reset;
+ }
+
+ if first.is_italic && !next.is_italic {
+ return Reset;
+ }
+
+ // Cannot un-underline, so must Reset.
+ if first.is_underline && !next.is_underline {
+ return Reset;
+ }
+
+ if first.is_blink && !next.is_blink {
+ return Reset;
+ }
+
+ if first.is_reverse && !next.is_reverse {
+ return Reset;
+ }
+
+ if first.is_hidden && !next.is_hidden {
+ return Reset;
+ }
+
+ if first.is_strikethrough && !next.is_strikethrough {
+ return Reset;
+ }
+
+ // Cannot go from foreground to no foreground, so must Reset.
+ if first.foreground.is_some() && next.foreground.is_none() {
+ return Reset;
+ }
+
+ // Cannot go from background to no background, so must Reset.
+ if first.background.is_some() && next.background.is_none() {
+ return Reset;
+ }
+
+ let mut extra_styles = Style::default();
+
+ if first.is_bold != next.is_bold {
+ extra_styles.is_bold = true;
+ }
+
+ if first.is_dimmed != next.is_dimmed {
+ extra_styles.is_dimmed = true;
+ }
+
+ if first.is_italic != next.is_italic {
+ extra_styles.is_italic = true;
+ }
+
+ if first.is_underline != next.is_underline {
+ extra_styles.is_underline = true;
+ }
+
+ if first.is_blink != next.is_blink {
+ extra_styles.is_blink = true;
+ }
+
+ if first.is_reverse != next.is_reverse {
+ extra_styles.is_reverse = true;
+ }
+
+ if first.is_hidden != next.is_hidden {
+ extra_styles.is_hidden = true;
+ }
+
+ if first.is_strikethrough != next.is_strikethrough {
+ extra_styles.is_strikethrough = true;
+ }
+
+ if first.foreground != next.foreground {
+ extra_styles.foreground = next.foreground;
+ }
+
+ if first.background != next.background {
+ extra_styles.background = next.background;
+ }
+
+ ExtraStyles(extra_styles)
+ }
+}
+
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use super::Difference::*;
+ use style::Colour::*;
+ use style::Style;
+
+ fn style() -> Style {
+ Style::new()
+ }
+
+ macro_rules! test {
+ ($name: ident: $first: expr; $next: expr => $result: expr) => {
+ #[test]
+ fn $name() {
+ assert_eq!($result, Difference::between(&$first, &$next));
+ }
+ };
+ }
+
+ test!(nothing: Green.normal(); Green.normal() => NoDifference);
+ test!(uppercase: Green.normal(); Green.bold() => ExtraStyles(style().bold()));
+ test!(lowercase: Green.bold(); Green.normal() => Reset);
+ test!(nothing2: Green.bold(); Green.bold() => NoDifference);
+
+ test!(colour_change: Red.normal(); Blue.normal() => ExtraStyles(Blue.normal()));
+
+ test!(addition_of_blink: style(); style().blink() => ExtraStyles(style().blink()));
+ test!(addition_of_dimmed: style(); style().dimmed() => ExtraStyles(style().dimmed()));
+ test!(addition_of_hidden: style(); style().hidden() => ExtraStyles(style().hidden()));
+ test!(addition_of_reverse: style(); style().reverse() => ExtraStyles(style().reverse()));
+ test!(addition_of_strikethrough: style(); style().strikethrough() => ExtraStyles(style().strikethrough()));
+
+ test!(removal_of_strikethrough: style().strikethrough(); style() => Reset);
+ test!(removal_of_reverse: style().reverse(); style() => Reset);
+ test!(removal_of_hidden: style().hidden(); style() => Reset);
+ test!(removal_of_dimmed: style().dimmed(); style() => Reset);
+ test!(removal_of_blink: style().blink(); style() => Reset);
+}
diff --git a/vendor/ansi_term/src/display.rs b/vendor/ansi_term/src/display.rs
new file mode 100644
index 000000000..17c54f008
--- /dev/null
+++ b/vendor/ansi_term/src/display.rs
@@ -0,0 +1,296 @@
+use std::borrow::Cow;
+use std::fmt;
+use std::io;
+use std::ops::Deref;
+
+use ansi::RESET;
+use difference::Difference;
+use style::{Style, Colour};
+use write::AnyWrite;
+
+
+/// An `ANSIGenericString` includes a generic string type and a `Style` to
+/// display that string. `ANSIString` and `ANSIByteString` are aliases for
+/// this type on `str` and `\[u8]`, respectively.
+#[derive(PartialEq, Debug)]
+pub struct ANSIGenericString<'a, S: 'a + ToOwned + ?Sized>
+where <S as ToOwned>::Owned: fmt::Debug {
+ style: Style,
+ string: Cow<'a, S>,
+}
+
+
+/// Cloning an `ANSIGenericString` will clone its underlying string.
+///
+/// # Examples
+///
+/// ```
+/// use ansi_term::ANSIString;
+///
+/// let plain_string = ANSIString::from("a plain string");
+/// let clone_string = plain_string.clone();
+/// assert_eq!(clone_string, plain_string);
+/// ```
+impl<'a, S: 'a + ToOwned + ?Sized> Clone for ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug {
+ fn clone(&self) -> ANSIGenericString<'a, S> {
+ ANSIGenericString {
+ style: self.style,
+ string: self.string.clone(),
+ }
+ }
+}
+
+// You might think that the hand-written Clone impl above is the same as the
+// one that gets generated with #[derive]. But it’s not *quite* the same!
+//
+// `str` is not Clone, and the derived Clone implementation puts a Clone
+// constraint on the S type parameter (generated using --pretty=expanded):
+//
+// ↓_________________↓
+// impl <'a, S: ::std::clone::Clone + 'a + ToOwned + ?Sized> ::std::clone::Clone
+// for ANSIGenericString<'a, S> where
+// <S as ToOwned>::Owned: fmt::Debug { ... }
+//
+// This resulted in compile errors when you tried to derive Clone on a type
+// that used it:
+//
+// #[derive(PartialEq, Debug, Clone, Default)]
+// pub struct TextCellContents(Vec<ANSIString<'static>>);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+// error[E0277]: the trait `std::clone::Clone` is not implemented for `str`
+//
+// The hand-written impl above can ignore that constraint and still compile.
+
+
+
+/// An ANSI String is a string coupled with the `Style` to display it
+/// in a terminal.
+///
+/// Although not technically a string itself, it can be turned into
+/// one with the `to_string` method.
+///
+/// # Examples
+///
+/// ```
+/// use ansi_term::ANSIString;
+/// use ansi_term::Colour::Red;
+///
+/// let red_string = Red.paint("a red string");
+/// println!("{}", red_string);
+/// ```
+///
+/// ```
+/// use ansi_term::ANSIString;
+///
+/// let plain_string = ANSIString::from("a plain string");
+/// assert_eq!(&*plain_string, "a plain string");
+/// ```
+pub type ANSIString<'a> = ANSIGenericString<'a, str>;
+
+/// An `ANSIByteString` represents a formatted series of bytes. Use
+/// `ANSIByteString` when styling text with an unknown encoding.
+pub type ANSIByteString<'a> = ANSIGenericString<'a, [u8]>;
+
+impl<'a, I, S: 'a + ToOwned + ?Sized> From<I> for ANSIGenericString<'a, S>
+where I: Into<Cow<'a, S>>,
+ <S as ToOwned>::Owned: fmt::Debug {
+ fn from(input: I) -> ANSIGenericString<'a, S> {
+ ANSIGenericString {
+ string: input.into(),
+ style: Style::default(),
+ }
+ }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericString<'a, S>
+ where <S as ToOwned>::Owned: fmt::Debug {
+
+ /// Directly access the style
+ pub fn style_ref(&self) -> &Style {
+ &self.style
+ }
+
+ /// Directly access the style mutably
+ pub fn style_ref_mut(&mut self) -> &mut Style {
+ &mut self.style
+ }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> Deref for ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug {
+ type Target = S;
+
+ fn deref(&self) -> &S {
+ self.string.deref()
+ }
+}
+
+
+/// A set of `ANSIGenericString`s collected together, in order to be
+/// written with a minimum of control characters.
+#[derive(Debug, PartialEq)]
+pub struct ANSIGenericStrings<'a, S: 'a + ToOwned + ?Sized>
+ (pub &'a [ANSIGenericString<'a, S>])
+ where <S as ToOwned>::Owned: fmt::Debug, S: PartialEq;
+
+/// A set of `ANSIString`s collected together, in order to be written with a
+/// minimum of control characters.
+pub type ANSIStrings<'a> = ANSIGenericStrings<'a, str>;
+
+/// A function to construct an `ANSIStrings` instance.
+#[allow(non_snake_case)]
+pub fn ANSIStrings<'a>(arg: &'a [ANSIString<'a>]) -> ANSIStrings<'a> {
+ ANSIGenericStrings(arg)
+}
+
+/// A set of `ANSIByteString`s collected together, in order to be
+/// written with a minimum of control characters.
+pub type ANSIByteStrings<'a> = ANSIGenericStrings<'a, [u8]>;
+
+/// A function to construct an `ANSIByteStrings` instance.
+#[allow(non_snake_case)]
+pub fn ANSIByteStrings<'a>(arg: &'a [ANSIByteString<'a>]) -> ANSIByteStrings<'a> {
+ ANSIGenericStrings(arg)
+}
+
+
+// ---- paint functions ----
+
+impl Style {
+
+ /// Paints the given text with this colour, returning an ANSI string.
+ #[must_use]
+ pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
+ where I: Into<Cow<'a, S>>,
+ <S as ToOwned>::Owned: fmt::Debug {
+ ANSIGenericString {
+ string: input.into(),
+ style: self,
+ }
+ }
+}
+
+
+impl Colour {
+
+ /// Paints the given text with this colour, returning an ANSI string.
+ /// This is a short-cut so you don’t have to use `Blue.normal()` just
+ /// to get blue text.
+ ///
+ /// ```
+ /// use ansi_term::Colour::Blue;
+ /// println!("{}", Blue.paint("da ba dee"));
+ /// ```
+ #[must_use]
+ pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
+ where I: Into<Cow<'a, S>>,
+ <S as ToOwned>::Owned: fmt::Debug {
+ ANSIGenericString {
+ string: input.into(),
+ style: self.normal(),
+ }
+ }
+}
+
+
+// ---- writers for individual ANSI strings ----
+
+impl<'a> fmt::Display for ANSIString<'a> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let w: &mut fmt::Write = f;
+ self.write_to_any(w)
+ }
+}
+
+impl<'a> ANSIByteString<'a> {
+ /// Write an `ANSIByteString` to an `io::Write`. This writes the escape
+ /// sequences for the associated `Style` around the bytes.
+ pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
+ let w: &mut io::Write = w;
+ self.write_to_any(w)
+ }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
+ fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
+ write!(w, "{}", self.style.prefix())?;
+ w.write_str(self.string.as_ref())?;
+ write!(w, "{}", self.style.suffix())
+ }
+}
+
+
+// ---- writers for combined ANSI strings ----
+
+impl<'a> fmt::Display for ANSIStrings<'a> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let f: &mut fmt::Write = f;
+ self.write_to_any(f)
+ }
+}
+
+impl<'a> ANSIByteStrings<'a> {
+ /// Write `ANSIByteStrings` to an `io::Write`. This writes the minimal
+ /// escape sequences for the associated `Style`s around each set of
+ /// bytes.
+ pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
+ let w: &mut io::Write = w;
+ self.write_to_any(w)
+ }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized + PartialEq> ANSIGenericStrings<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
+ fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
+ use self::Difference::*;
+
+ let first = match self.0.first() {
+ None => return Ok(()),
+ Some(f) => f,
+ };
+
+ write!(w, "{}", first.style.prefix())?;
+ w.write_str(first.string.as_ref())?;
+
+ for window in self.0.windows(2) {
+ match Difference::between(&window[0].style, &window[1].style) {
+ ExtraStyles(style) => write!(w, "{}", style.prefix())?,
+ Reset => write!(w, "{}{}", RESET, window[1].style.prefix())?,
+ NoDifference => {/* Do nothing! */},
+ }
+
+ w.write_str(&window[1].string)?;
+ }
+
+ // Write the final reset string after all of the ANSIStrings have been
+ // written, *except* if the last one has no styles, because it would
+ // have already been written by this point.
+ if let Some(last) = self.0.last() {
+ if !last.style.is_plain() {
+ write!(w, "{}", RESET)?;
+ }
+ }
+
+ Ok(())
+ }
+}
+
+
+// ---- tests ----
+
+#[cfg(test)]
+mod tests {
+ pub use super::super::ANSIStrings;
+ pub use style::Style;
+ pub use style::Colour::*;
+
+ #[test]
+ fn no_control_codes_for_plain() {
+ let one = Style::default().paint("one");
+ let two = Style::default().paint("two");
+ let output = format!("{}", ANSIStrings( &[ one, two ] ));
+ assert_eq!(&*output, "onetwo");
+ }
+}
diff --git a/vendor/ansi_term/src/lib.rs b/vendor/ansi_term/src/lib.rs
new file mode 100644
index 000000000..2d2f83ae6
--- /dev/null
+++ b/vendor/ansi_term/src/lib.rs
@@ -0,0 +1,271 @@
+//! This is a library for controlling colours and formatting, such as
+//! red bold text or blue underlined text, on ANSI terminals.
+//!
+//!
+//! ## Basic usage
+//!
+//! There are three main types in this crate that you need to be
+//! concerned with: [`ANSIString`], [`Style`], and [`Colour`].
+//!
+//! A `Style` holds stylistic information: foreground and background colours,
+//! whether the text should be bold, or blinking, or other properties. The
+//! [`Colour`] enum represents the available colours. And an [`ANSIString`] is a
+//! string paired with a [`Style`].
+//!
+//! [`Color`] is also available as an alias to `Colour`.
+//!
+//! To format a string, call the `paint` method on a `Style` or a `Colour`,
+//! passing in the string you want to format as the argument. For example,
+//! here’s how to get some red text:
+//!
+//! ```
+//! use ansi_term::Colour::Red;
+//!
+//! println!("This is in red: {}", Red.paint("a red string"));
+//! ```
+//!
+//! It’s important to note that the `paint` method does *not* actually return a
+//! string with the ANSI control characters surrounding it. Instead, it returns
+//! an [`ANSIString`] value that has a [`Display`] implementation that, when
+//! formatted, returns the characters. This allows strings to be printed with a
+//! minimum of [`String`] allocations being performed behind the scenes.
+//!
+//! If you *do* want to get at the escape codes, then you can convert the
+//! [`ANSIString`] to a string as you would any other `Display` value:
+//!
+//! ```
+//! use ansi_term::Colour::Red;
+//!
+//! let red_string = Red.paint("a red string").to_string();
+//! ```
+//!
+//!
+//! ## Bold, underline, background, and other styles
+//!
+//! For anything more complex than plain foreground colour changes, you need to
+//! construct `Style` values themselves, rather than beginning with a `Colour`.
+//! You can do this by chaining methods based on a new `Style`, created with
+//! [`Style::new()`]. Each method creates a new style that has that specific
+//! property set. For example:
+//!
+//! ```
+//! use ansi_term::Style;
+//!
+//! println!("How about some {} and {}?",
+//! Style::new().bold().paint("bold"),
+//! Style::new().underline().paint("underline"));
+//! ```
+//!
+//! For brevity, these methods have also been implemented for `Colour` values,
+//! so you can give your styles a foreground colour without having to begin with
+//! an empty `Style` value:
+//!
+//! ```
+//! use ansi_term::Colour::{Blue, Yellow};
+//!
+//! println!("Demonstrating {} and {}!",
+//! Blue.bold().paint("blue bold"),
+//! Yellow.underline().paint("yellow underline"));
+//!
+//! println!("Yellow on blue: {}", Yellow.on(Blue).paint("wow!"));
+//! ```
+//!
+//! The complete list of styles you can use are: [`bold`], [`dimmed`], [`italic`],
+//! [`underline`], [`blink`], [`reverse`], [`hidden`], [`strikethrough`], and [`on`] for
+//! background colours.
+//!
+//! In some cases, you may find it easier to change the foreground on an
+//! existing `Style` rather than starting from the appropriate `Colour`.
+//! You can do this using the [`fg`] method:
+//!
+//! ```
+//! use ansi_term::Style;
+//! use ansi_term::Colour::{Blue, Cyan, Yellow};
+//!
+//! println!("Yellow on blue: {}", Style::new().on(Blue).fg(Yellow).paint("yow!"));
+//! println!("Also yellow on blue: {}", Cyan.on(Blue).fg(Yellow).paint("zow!"));
+//! ```
+//!
+//! You can turn a `Colour` into a `Style` with the [`normal`] method.
+//! This will produce the exact same `ANSIString` as if you just used the
+//! `paint` method on the `Colour` directly, but it’s useful in certain cases:
+//! for example, you may have a method that returns `Styles`, and need to
+//! represent both the “red bold” and “red, but not bold” styles with values of
+//! the same type. The `Style` struct also has a [`Default`] implementation if you
+//! want to have a style with *nothing* set.
+//!
+//! ```
+//! use ansi_term::Style;
+//! use ansi_term::Colour::Red;
+//!
+//! Red.normal().paint("yet another red string");
+//! Style::default().paint("a completely regular string");
+//! ```
+//!
+//!
+//! ## Extended colours
+//!
+//! You can access the extended range of 256 colours by using the `Colour::Fixed`
+//! variant, which takes an argument of the colour number to use. This can be
+//! included wherever you would use a `Colour`:
+//!
+//! ```
+//! use ansi_term::Colour::Fixed;
+//!
+//! Fixed(134).paint("A sort of light purple");
+//! Fixed(221).on(Fixed(124)).paint("Mustard in the ketchup");
+//! ```
+//!
+//! The first sixteen of these values are the same as the normal and bold
+//! standard colour variants. There’s nothing stopping you from using these as
+//! `Fixed` colours instead, but there’s nothing to be gained by doing so
+//! either.
+//!
+//! You can also access full 24-bit colour by using the `Colour::RGB` variant,
+//! which takes separate `u8` arguments for red, green, and blue:
+//!
+//! ```
+//! use ansi_term::Colour::RGB;
+//!
+//! RGB(70, 130, 180).paint("Steel blue");
+//! ```
+//!
+//! ## Combining successive coloured strings
+//!
+//! The benefit of writing ANSI escape codes to the terminal is that they
+//! *stack*: you do not need to end every coloured string with a reset code if
+//! the text that follows it is of a similar style. For example, if you want to
+//! have some blue text followed by some blue bold text, it’s possible to send
+//! the ANSI code for blue, followed by the ANSI code for bold, and finishing
+//! with a reset code without having to have an extra one between the two
+//! strings.
+//!
+//! This crate can optimise the ANSI codes that get printed in situations like
+//! this, making life easier for your terminal renderer. The [`ANSIStrings`]
+//! type takes a slice of several [`ANSIString`] values, and will iterate over
+//! each of them, printing only the codes for the styles that need to be updated
+//! as part of its formatting routine.
+//!
+//! The following code snippet uses this to enclose a binary number displayed in
+//! red bold text inside some red, but not bold, brackets:
+//!
+//! ```
+//! use ansi_term::Colour::Red;
+//! use ansi_term::{ANSIString, ANSIStrings};
+//!
+//! let some_value = format!("{:b}", 42);
+//! let strings: &[ANSIString<'static>] = &[
+//! Red.paint("["),
+//! Red.bold().paint(some_value),
+//! Red.paint("]"),
+//! ];
+//!
+//! println!("Value: {}", ANSIStrings(strings));
+//! ```
+//!
+//! There are several things to note here. Firstly, the [`paint`] method can take
+//! *either* an owned [`String`] or a borrowed [`&str`]. Internally, an [`ANSIString`]
+//! holds a copy-on-write ([`Cow`]) string value to deal with both owned and
+//! borrowed strings at the same time. This is used here to display a `String`,
+//! the result of the `format!` call, using the same mechanism as some
+//! statically-available `&str` slices. Secondly, that the [`ANSIStrings`] value
+//! works in the same way as its singular counterpart, with a [`Display`]
+//! implementation that only performs the formatting when required.
+//!
+//! ## Byte strings
+//!
+//! This library also supports formatting `\[u8]` byte strings; this supports
+//! applications working with text in an unknown encoding. [`Style`] and
+//! [`Colour`] support painting `\[u8]` values, resulting in an [`ANSIByteString`].
+//! This type does not implement [`Display`], as it may not contain UTF-8, but
+//! it does provide a method [`write_to`] to write the result to any value that
+//! implements [`Write`]:
+//!
+//! ```
+//! use ansi_term::Colour::Green;
+//!
+//! Green.paint("user data".as_bytes()).write_to(&mut std::io::stdout()).unwrap();
+//! ```
+//!
+//! Similarly, the type [`ANSIByteStrings`] supports writing a list of
+//! [`ANSIByteString`] values with minimal escape sequences:
+//!
+//! ```
+//! use ansi_term::Colour::Green;
+//! use ansi_term::ANSIByteStrings;
+//!
+//! ANSIByteStrings(&[
+//! Green.paint("user data 1\n".as_bytes()),
+//! Green.bold().paint("user data 2\n".as_bytes()),
+//! ]).write_to(&mut std::io::stdout()).unwrap();
+//! ```
+//!
+//! [`Cow`]: https://doc.rust-lang.org/std/borrow/enum.Cow.html
+//! [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
+//! [`Default`]: https://doc.rust-lang.org/std/default/trait.Default.html
+//! [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
+//! [`&str`]: https://doc.rust-lang.org/std/primitive.str.html
+//! [`Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
+//! [`Style`]: struct.Style.html
+//! [`Style::new()`]: struct.Style.html#method.new
+//! [`Color`]: enum.Color.html
+//! [`Colour`]: enum.Colour.html
+//! [`ANSIString`]: type.ANSIString.html
+//! [`ANSIStrings`]: type.ANSIStrings.html
+//! [`ANSIByteString`]: type.ANSIByteString.html
+//! [`ANSIByteStrings`]: type.ANSIByteStrings.html
+//! [`write_to`]: type.ANSIByteString.html#method.write_to
+//! [`paint`]: type.ANSIByteString.html#method.write_to
+//! [`normal`]: enum.Colour.html#method.normal
+//!
+//! [`bold`]: struct.Style.html#method.bold
+//! [`dimmed`]: struct.Style.html#method.dimmed
+//! [`italic`]: struct.Style.html#method.italic
+//! [`underline`]: struct.Style.html#method.underline
+//! [`blink`]: struct.Style.html#method.blink
+//! [`reverse`]: struct.Style.html#method.reverse
+//! [`hidden`]: struct.Style.html#method.hidden
+//! [`strikethrough`]: struct.Style.html#method.strikethrough
+//! [`fg`]: struct.Style.html#method.fg
+//! [`on`]: struct.Style.html#method.on
+
+#![crate_name = "ansi_term"]
+#![crate_type = "rlib"]
+#![crate_type = "dylib"]
+
+#![warn(missing_copy_implementations)]
+#![warn(missing_docs)]
+#![warn(trivial_casts, trivial_numeric_casts)]
+#![warn(unused_extern_crates, unused_qualifications)]
+
+#[cfg(target_os="windows")]
+extern crate winapi;
+#[cfg(test)]
+#[macro_use]
+extern crate doc_comment;
+
+#[cfg(test)]
+doctest!("../README.md");
+
+mod ansi;
+pub use ansi::{Prefix, Infix, Suffix};
+
+mod style;
+pub use style::{Colour, Style};
+
+/// Color is a type alias for `Colour`.
+pub use Colour as Color;
+
+mod difference;
+mod display;
+pub use display::*;
+
+mod write;
+
+mod windows;
+pub use windows::*;
+
+mod util;
+pub use util::*;
+
+mod debug;
diff --git a/vendor/ansi_term/src/style.rs b/vendor/ansi_term/src/style.rs
new file mode 100644
index 000000000..1bee4d91c
--- /dev/null
+++ b/vendor/ansi_term/src/style.rs
@@ -0,0 +1,521 @@
+/// A style is a collection of properties that can format a string
+/// using ANSI escape codes.
+///
+/// # Examples
+///
+/// ```
+/// use ansi_term::{Style, Colour};
+///
+/// let style = Style::new().bold().on(Colour::Black);
+/// println!("{}", style.paint("Bold on black"));
+/// ```
+#[derive(PartialEq, Clone, Copy)]
+#[cfg_attr(feature = "derive_serde_style", derive(serde::Deserialize, serde::Serialize))]
+pub struct Style {
+
+ /// The style's foreground colour, if it has one.
+ pub foreground: Option<Colour>,
+
+ /// The style's background colour, if it has one.
+ pub background: Option<Colour>,
+
+ /// Whether this style is bold.
+ pub is_bold: bool,
+
+ /// Whether this style is dimmed.
+ pub is_dimmed: bool,
+
+ /// Whether this style is italic.
+ pub is_italic: bool,
+
+ /// Whether this style is underlined.
+ pub is_underline: bool,
+
+ /// Whether this style is blinking.
+ pub is_blink: bool,
+
+ /// Whether this style has reverse colours.
+ pub is_reverse: bool,
+
+ /// Whether this style is hidden.
+ pub is_hidden: bool,
+
+ /// Whether this style is struckthrough.
+ pub is_strikethrough: bool
+}
+
+impl Style {
+
+ /// Creates a new Style with no properties set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new();
+ /// println!("{}", style.paint("hi"));
+ /// ```
+ pub fn new() -> Style {
+ Style::default()
+ }
+
+ /// Returns a `Style` with the bold property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().bold();
+ /// println!("{}", style.paint("hey"));
+ /// ```
+ pub fn bold(&self) -> Style {
+ Style { is_bold: true, .. *self }
+ }
+
+ /// Returns a `Style` with the dimmed property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().dimmed();
+ /// println!("{}", style.paint("sup"));
+ /// ```
+ pub fn dimmed(&self) -> Style {
+ Style { is_dimmed: true, .. *self }
+ }
+
+ /// Returns a `Style` with the italic property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().italic();
+ /// println!("{}", style.paint("greetings"));
+ /// ```
+ pub fn italic(&self) -> Style {
+ Style { is_italic: true, .. *self }
+ }
+
+ /// Returns a `Style` with the underline property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().underline();
+ /// println!("{}", style.paint("salutations"));
+ /// ```
+ pub fn underline(&self) -> Style {
+ Style { is_underline: true, .. *self }
+ }
+
+ /// Returns a `Style` with the blink property set.
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().blink();
+ /// println!("{}", style.paint("wazzup"));
+ /// ```
+ pub fn blink(&self) -> Style {
+ Style { is_blink: true, .. *self }
+ }
+
+ /// Returns a `Style` with the reverse property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().reverse();
+ /// println!("{}", style.paint("aloha"));
+ /// ```
+ pub fn reverse(&self) -> Style {
+ Style { is_reverse: true, .. *self }
+ }
+
+ /// Returns a `Style` with the hidden property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().hidden();
+ /// println!("{}", style.paint("ahoy"));
+ /// ```
+ pub fn hidden(&self) -> Style {
+ Style { is_hidden: true, .. *self }
+ }
+
+ /// Returns a `Style` with the strikethrough property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// let style = Style::new().strikethrough();
+ /// println!("{}", style.paint("yo"));
+ /// ```
+ pub fn strikethrough(&self) -> Style {
+ Style { is_strikethrough: true, .. *self }
+ }
+
+ /// Returns a `Style` with the foreground colour property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour};
+ ///
+ /// let style = Style::new().fg(Colour::Yellow);
+ /// println!("{}", style.paint("hi"));
+ /// ```
+ pub fn fg(&self, foreground: Colour) -> Style {
+ Style { foreground: Some(foreground), .. *self }
+ }
+
+ /// Returns a `Style` with the background colour property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour};
+ ///
+ /// let style = Style::new().on(Colour::Blue);
+ /// println!("{}", style.paint("eyyyy"));
+ /// ```
+ pub fn on(&self, background: Colour) -> Style {
+ Style { background: Some(background), .. *self }
+ }
+
+ /// Return true if this `Style` has no actual styles, and can be written
+ /// without any control characters.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ ///
+ /// assert_eq!(true, Style::default().is_plain());
+ /// assert_eq!(false, Style::default().bold().is_plain());
+ /// ```
+ pub fn is_plain(self) -> bool {
+ self == Style::default()
+ }
+}
+
+impl Default for Style {
+
+ /// Returns a style with *no* properties set. Formatting text using this
+ /// style returns the exact same text.
+ ///
+ /// ```
+ /// use ansi_term::Style;
+ /// assert_eq!(None, Style::default().foreground);
+ /// assert_eq!(None, Style::default().background);
+ /// assert_eq!(false, Style::default().is_bold);
+ /// assert_eq!("txt", Style::default().paint("txt").to_string());
+ /// ```
+ fn default() -> Style {
+ Style {
+ foreground: None,
+ background: None,
+ is_bold: false,
+ is_dimmed: false,
+ is_italic: false,
+ is_underline: false,
+ is_blink: false,
+ is_reverse: false,
+ is_hidden: false,
+ is_strikethrough: false,
+ }
+ }
+}
+
+
+// ---- colours ----
+
+/// A colour is one specific type of ANSI escape code, and can refer
+/// to either the foreground or background colour.
+///
+/// These use the standard numeric sequences.
+/// See <http://invisible-island.net/xterm/ctlseqs/ctlseqs.html>
+#[derive(PartialEq, Clone, Copy, Debug)]
+#[cfg_attr(feature = "derive_serde_style", derive(serde::Deserialize, serde::Serialize))]
+pub enum Colour {
+
+ /// Colour #0 (foreground code `30`, background code `40`).
+ ///
+ /// This is not necessarily the background colour, and using it as one may
+ /// render the text hard to read on terminals with dark backgrounds.
+ Black,
+
+ /// Colour #1 (foreground code `31`, background code `41`).
+ Red,
+
+ /// Colour #2 (foreground code `32`, background code `42`).
+ Green,
+
+ /// Colour #3 (foreground code `33`, background code `43`).
+ Yellow,
+
+ /// Colour #4 (foreground code `34`, background code `44`).
+ Blue,
+
+ /// Colour #5 (foreground code `35`, background code `45`).
+ Purple,
+
+ /// Colour #6 (foreground code `36`, background code `46`).
+ Cyan,
+
+ /// Colour #7 (foreground code `37`, background code `47`).
+ ///
+ /// As above, this is not necessarily the foreground colour, and may be
+ /// hard to read on terminals with light backgrounds.
+ White,
+
+ /// A colour number from 0 to 255, for use in 256-colour terminal
+ /// environments.
+ ///
+ /// - Colours 0 to 7 are the `Black` to `White` variants respectively.
+ /// These colours can usually be changed in the terminal emulator.
+ /// - Colours 8 to 15 are brighter versions of the eight colours above.
+ /// These can also usually be changed in the terminal emulator, or it
+ /// could be configured to use the original colours and show the text in
+ /// bold instead. It varies depending on the program.
+ /// - Colours 16 to 231 contain several palettes of bright colours,
+ /// arranged in six squares measuring six by six each.
+ /// - Colours 232 to 255 are shades of grey from black to white.
+ ///
+ /// It might make more sense to look at a [colour chart][cc].
+ ///
+ /// [cc]: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg
+ Fixed(u8),
+
+ /// A 24-bit RGB color, as specified by ISO-8613-3.
+ RGB(u8, u8, u8),
+}
+
+
+impl Colour {
+
+ /// Returns a `Style` with the foreground colour set to this colour.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Red.normal();
+ /// println!("{}", style.paint("hi"));
+ /// ```
+ pub fn normal(self) -> Style {
+ Style { foreground: Some(self), .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// bold property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Green.bold();
+ /// println!("{}", style.paint("hey"));
+ /// ```
+ pub fn bold(self) -> Style {
+ Style { foreground: Some(self), is_bold: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// dimmed property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Yellow.dimmed();
+ /// println!("{}", style.paint("sup"));
+ /// ```
+ pub fn dimmed(self) -> Style {
+ Style { foreground: Some(self), is_dimmed: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// italic property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Blue.italic();
+ /// println!("{}", style.paint("greetings"));
+ /// ```
+ pub fn italic(self) -> Style {
+ Style { foreground: Some(self), is_italic: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// underline property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Purple.underline();
+ /// println!("{}", style.paint("salutations"));
+ /// ```
+ pub fn underline(self) -> Style {
+ Style { foreground: Some(self), is_underline: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// blink property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Cyan.blink();
+ /// println!("{}", style.paint("wazzup"));
+ /// ```
+ pub fn blink(self) -> Style {
+ Style { foreground: Some(self), is_blink: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// reverse property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Black.reverse();
+ /// println!("{}", style.paint("aloha"));
+ /// ```
+ pub fn reverse(self) -> Style {
+ Style { foreground: Some(self), is_reverse: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// hidden property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::White.hidden();
+ /// println!("{}", style.paint("ahoy"));
+ /// ```
+ pub fn hidden(self) -> Style {
+ Style { foreground: Some(self), is_hidden: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// strikethrough property set.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::Fixed(244).strikethrough();
+ /// println!("{}", style.paint("yo"));
+ /// ```
+ pub fn strikethrough(self) -> Style {
+ Style { foreground: Some(self), is_strikethrough: true, .. Style::default() }
+ }
+
+ /// Returns a `Style` with the foreground colour set to this colour and the
+ /// background colour property set to the given colour.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use ansi_term::Colour;
+ ///
+ /// let style = Colour::RGB(31, 31, 31).on(Colour::White);
+ /// println!("{}", style.paint("eyyyy"));
+ /// ```
+ pub fn on(self, background: Colour) -> Style {
+ Style { foreground: Some(self), background: Some(background), .. Style::default() }
+ }
+}
+
+impl From<Colour> for Style {
+
+ /// You can turn a `Colour` into a `Style` with the foreground colour set
+ /// with the `From` trait.
+ ///
+ /// ```
+ /// use ansi_term::{Style, Colour};
+ /// let green_foreground = Style::default().fg(Colour::Green);
+ /// assert_eq!(green_foreground, Colour::Green.normal());
+ /// assert_eq!(green_foreground, Colour::Green.into());
+ /// assert_eq!(green_foreground, Style::from(Colour::Green));
+ /// ```
+ fn from(colour: Colour) -> Style {
+ colour.normal()
+ }
+}
+
+#[cfg(test)]
+#[cfg(feature = "derive_serde_style")]
+mod serde_json_tests {
+ use super::{Style, Colour};
+
+ #[test]
+ fn colour_serialization() {
+
+ let colours = &[
+ Colour::Red,
+ Colour::Blue,
+ Colour::RGB(123, 123, 123),
+ Colour::Fixed(255),
+ ];
+
+ assert_eq!(serde_json::to_string(&colours).unwrap(), String::from("[\"Red\",\"Blue\",{\"RGB\":[123,123,123]},{\"Fixed\":255}]"));
+ }
+
+ #[test]
+ fn colour_deserialization() {
+ let colours = &[
+ Colour::Red,
+ Colour::Blue,
+ Colour::RGB(123, 123, 123),
+ Colour::Fixed(255),
+ ];
+
+ for colour in colours.into_iter() {
+ let serialized = serde_json::to_string(&colour).unwrap();
+ let deserialized: Colour = serde_json::from_str(&serialized).unwrap();
+
+ assert_eq!(colour, &deserialized);
+ }
+ }
+
+ #[test]
+ fn style_serialization() {
+ let style = Style::default();
+
+ assert_eq!(serde_json::to_string(&style).unwrap(), "{\"foreground\":null,\"background\":null,\"is_bold\":false,\"is_dimmed\":false,\"is_italic\":false,\"is_underline\":false,\"is_blink\":false,\"is_reverse\":false,\"is_hidden\":false,\"is_strikethrough\":false}".to_string());
+ }
+}
diff --git a/vendor/ansi_term/src/util.rs b/vendor/ansi_term/src/util.rs
new file mode 100644
index 000000000..ba0f12a02
--- /dev/null
+++ b/vendor/ansi_term/src/util.rs
@@ -0,0 +1,81 @@
+use display::*;
+use std::ops::Deref;
+
+/// Return a substring of the given ANSIStrings sequence, while keeping the formatting.
+pub fn sub_string<'a>(start: usize, len: usize, strs: &ANSIStrings<'a>) -> Vec<ANSIString<'static>> {
+ let mut vec = Vec::new();
+ let mut pos = start;
+ let mut len_rem = len;
+
+ for i in strs.0.iter() {
+ let fragment = i.deref();
+ let frag_len = fragment.len();
+ if pos >= frag_len {
+ pos -= frag_len;
+ continue;
+ }
+ if len_rem <= 0 {
+ break;
+ }
+
+ let end = pos + len_rem;
+ let pos_end = if end >= frag_len { frag_len } else { end };
+
+ vec.push(i.style_ref().paint(String::from(&fragment[pos..pos_end])));
+
+ if end <= frag_len {
+ break;
+ }
+
+ len_rem -= pos_end - pos;
+ pos = 0;
+ }
+
+ vec
+}
+
+/// Return a concatenated copy of `strs` without the formatting, as an allocated `String`.
+pub fn unstyle(strs: &ANSIStrings) -> String {
+ let mut s = String::new();
+
+ for i in strs.0.iter() {
+ s += &i.deref();
+ }
+
+ s
+}
+
+/// Return the unstyled length of ANSIStrings. This is equaivalent to `unstyle(strs).len()`.
+pub fn unstyled_len(strs: &ANSIStrings) -> usize {
+ let mut l = 0;
+ for i in strs.0.iter() {
+ l += i.deref().len();
+ }
+ l
+}
+
+#[cfg(test)]
+mod test {
+ use Colour::*;
+ use display::*;
+ use super::*;
+
+ #[test]
+ fn test() {
+ let l = [
+ Black.paint("first"),
+ Red.paint("-second"),
+ White.paint("-third"),
+ ];
+ let a = ANSIStrings(&l);
+ assert_eq!(unstyle(&a), "first-second-third");
+ assert_eq!(unstyled_len(&a), 18);
+
+ let l2 = [
+ Black.paint("st"),
+ Red.paint("-second"),
+ White.paint("-t"),
+ ];
+ assert_eq!(sub_string(3, 11, &a).as_slice(), &l2);
+ }
+}
diff --git a/vendor/ansi_term/src/windows.rs b/vendor/ansi_term/src/windows.rs
new file mode 100644
index 000000000..fcf02ecf6
--- /dev/null
+++ b/vendor/ansi_term/src/windows.rs
@@ -0,0 +1,61 @@
+/// Enables ANSI code support on Windows 10.
+///
+/// This uses Windows API calls to alter the properties of the console that
+/// the program is running in.
+///
+/// https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
+///
+/// Returns a `Result` with the Windows error code if unsuccessful.
+#[cfg(windows)]
+pub fn enable_ansi_support() -> Result<(), u32> {
+ // ref: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#EXAMPLE_OF_ENABLING_VIRTUAL_TERMINAL_PROCESSING @@ https://archive.is/L7wRJ#76%
+
+ use std::ffi::OsStr;
+ use std::iter::once;
+ use std::os::windows::ffi::OsStrExt;
+ use std::ptr::null_mut;
+ use winapi::um::consoleapi::{GetConsoleMode, SetConsoleMode};
+ use winapi::um::errhandlingapi::GetLastError;
+ use winapi::um::fileapi::{CreateFileW, OPEN_EXISTING};
+ use winapi::um::handleapi::INVALID_HANDLE_VALUE;
+ use winapi::um::winnt::{FILE_SHARE_WRITE, GENERIC_READ, GENERIC_WRITE};
+
+ const ENABLE_VIRTUAL_TERMINAL_PROCESSING: u32 = 0x0004;
+
+ unsafe {
+ // ref: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew
+ // Using `CreateFileW("CONOUT$", ...)` to retrieve the console handle works correctly even if STDOUT and/or STDERR are redirected
+ let console_out_name: Vec<u16> = OsStr::new("CONOUT$").encode_wide().chain(once(0)).collect();
+ let console_handle = CreateFileW(
+ console_out_name.as_ptr(),
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ null_mut(),
+ OPEN_EXISTING,
+ 0,
+ null_mut(),
+ );
+ if console_handle == INVALID_HANDLE_VALUE
+ {
+ return Err(GetLastError());
+ }
+
+ // ref: https://docs.microsoft.com/en-us/windows/console/getconsolemode
+ let mut console_mode: u32 = 0;
+ if 0 == GetConsoleMode(console_handle, &mut console_mode)
+ {
+ return Err(GetLastError());
+ }
+
+ // VT processing not already enabled?
+ if console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0 {
+ // https://docs.microsoft.com/en-us/windows/console/setconsolemode
+ if 0 == SetConsoleMode(console_handle, console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+ {
+ return Err(GetLastError());
+ }
+ }
+ }
+
+ return Ok(());
+}
diff --git a/vendor/ansi_term/src/write.rs b/vendor/ansi_term/src/write.rs
new file mode 100644
index 000000000..65a64feb2
--- /dev/null
+++ b/vendor/ansi_term/src/write.rs
@@ -0,0 +1,40 @@
+use std::fmt;
+use std::io;
+
+
+pub trait AnyWrite {
+ type wstr: ?Sized;
+ type Error;
+
+ fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error>;
+
+ fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error>;
+}
+
+
+impl<'a> AnyWrite for fmt::Write + 'a {
+ type wstr = str;
+ type Error = fmt::Error;
+
+ fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
+ fmt::Write::write_fmt(self, fmt)
+ }
+
+ fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
+ fmt::Write::write_str(self, s)
+ }
+}
+
+
+impl<'a> AnyWrite for io::Write + 'a {
+ type wstr = [u8];
+ type Error = io::Error;
+
+ fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
+ io::Write::write_fmt(self, fmt)
+ }
+
+ fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
+ io::Write::write_all(self, s)
+ }
+}