summaryrefslogtreecommitdiffstats
path: root/vendor/yansi-term/src/display.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /vendor/yansi-term/src/display.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/yansi-term/src/display.rs')
-rw-r--r--vendor/yansi-term/src/display.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/vendor/yansi-term/src/display.rs b/vendor/yansi-term/src/display.rs
new file mode 100644
index 000000000..afc4e2846
--- /dev/null
+++ b/vendor/yansi-term/src/display.rs
@@ -0,0 +1,80 @@
+use std::{cell::Cell, fmt};
+
+use crate::{Colour, Style};
+
+/// An `DisplayANSI` includes a format function and a `Style`
+struct DisplayANSI<F: FnOnce(&mut fmt::Formatter) -> fmt::Result> {
+ style: Style,
+ f: Cell<Option<F>>,
+}
+
+impl<F: FnOnce(&mut fmt::Formatter) -> fmt::Result> fmt::Display for DisplayANSI<F> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let written = self.style.write_prefix(f)?;
+ self.f.take().ok_or(fmt::Error).and_then(|c| c(f))?;
+ if written {
+ Style::write_reset(f)?;
+ }
+ Ok(())
+ }
+}
+
+impl Style {
+ /// Paints the given text with this style
+ #[inline]
+ pub fn paint<'a>(self, input: &'a str) -> impl fmt::Display + 'a {
+ DisplayANSI {
+ f: Cell::new(Some(move |f: &mut fmt::Formatter| f.write_str(input))),
+ style: self,
+ }
+ }
+
+ /// Paints the given format function with this style
+ #[inline]
+ pub fn paint_fn<F: FnOnce(&mut fmt::Formatter) -> fmt::Result>(
+ self,
+ f: F,
+ ) -> impl fmt::Display {
+ DisplayANSI {
+ f: Cell::new(Some(f)),
+ style: self,
+ }
+ }
+}
+
+impl Colour {
+ /// Paints the given text with this colour
+ /// This is a short-cut so you don’t have to use `Blue.normal()` just
+ /// to get blue text.
+ ///
+ /// ```
+ /// use yansi_term::Colour::Blue;
+ /// println!("{}", Blue.paint("da ba dee"));
+ /// ```
+ #[inline]
+ pub fn paint<'a>(self, input: &'a str) -> impl fmt::Display + 'a {
+ self.normal().paint(input)
+ }
+
+ /// Paints the given format function with this colour
+ #[inline]
+ pub fn paint_fn<F: FnOnce(&mut fmt::Formatter) -> fmt::Result>(
+ self,
+ f: F,
+ ) -> impl fmt::Display {
+ self.normal().paint_fn(f)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn no_control_codes_for_plain() {
+ let one = Style::default().paint("one");
+ let two = Style::default().paint("two");
+ let output = format!("{}{}", one, two);
+ assert_eq!(output, "onetwo");
+ }
+}