From 6790eb66256486019f438710edb7c17903693f1f Mon Sep 17 00:00:00 2001 From: Mike Grunweg Date: Fri, 6 May 2022 18:08:24 +0200 Subject: [PATCH 1/4] Add/tweak documentation in term.rs. --- src/term.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/term.rs b/src/term.rs index 350a7894..bc8eec87 100644 --- a/src/term.rs +++ b/src/term.rs @@ -25,18 +25,22 @@ pub struct ReadWritePair { #[allow(unused)] read: Arc>, write: Arc>, + /// How output is printed: foreground and background colour, formatting, etc. style: Style, } /// Where the term is writing. #[derive(Debug, Clone)] pub enum TermTarget { + /// standard output Stdout, + /// standard error Stderr, #[cfg(unix)] ReadWritePair(ReadWritePair), } +/// Underlying data of the terminal: its target and buffer. #[derive(Debug)] pub struct TermInner { target: TermTarget, @@ -126,11 +130,14 @@ impl<'a> TermFeatures<'a> { #[derive(Clone, Debug)] pub struct Term { inner: Arc, + /// See [is_msys_tty](TermFeatures::is_msys_tty). pub(crate) is_msys_tty: bool, + /// If this is a user attended tty. pub(crate) is_tty: bool, } impl Term { + /// Construct an instance from given data. fn with_inner(inner: TermInner) -> Term { let mut term = Term { inner: Arc::new(inner), @@ -143,7 +150,7 @@ impl Term { term } - /// Return a new unbuffered terminal. + /// Return a new unbuffered terminal, writing to stdout. #[inline] pub fn stdout() -> Term { Term::with_inner(TermInner { @@ -152,7 +159,7 @@ impl Term { }) } - /// Return a new unbuffered terminal to stderr. + /// Return a new unbuffered terminal, writing to stderr. #[inline] pub fn stderr() -> Term { Term::with_inner(TermInner { @@ -161,7 +168,7 @@ impl Term { }) } - /// Return a new buffered terminal. + /// Return a new buffered terminal, writing to stderr. pub fn buffered_stdout() -> Term { Term::with_inner(TermInner { target: TermTarget::Stdout, @@ -169,7 +176,7 @@ impl Term { }) } - /// Return a new buffered terminal to stderr. + /// Return a new buffered terminal, writing to stderr. pub fn buffered_stderr() -> Term { Term::with_inner(TermInner { target: TermTarget::Stderr, From c8c0b6d58e12db1e62301d127ca542e64edb2c23 Mon Sep 17 00:00:00 2001 From: Mike Grunweg Date: Fri, 6 May 2022 18:08:52 +0200 Subject: [PATCH 2/4] Implement reading from a Read/Write pair. --- src/term.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/term.rs b/src/term.rs index bc8eec87..0e73de7c 100644 --- a/src/term.rs +++ b/src/term.rs @@ -22,7 +22,6 @@ impl TermRead for T {} #[cfg(unix)] #[derive(Debug, Clone)] pub struct ReadWritePair { - #[allow(unused)] read: Arc>, write: Arc>, /// How output is printed: foreground and background colour, formatting, etc. @@ -37,6 +36,7 @@ pub enum TermTarget { /// standard error Stderr, #[cfg(unix)] + /// anything which implements the Read and Write traits XXX fixup ReadWritePair(ReadWritePair), } @@ -294,7 +294,24 @@ impl Term { return Ok("".into()); } let mut rv = String::new(); - io::stdin().read_line(&mut rv)?; + match &self.inner.target { + TermTarget::Stdout | TermTarget::Stderr => { io::stdin().read_line(&mut rv)?; }, + TermTarget::ReadWritePair(ReadWritePair { read, .. }) => { + let mut input = read.lock().unwrap(); + // Read a single char until we hit a newline ("\n", an 0xA byte). + let mut output_bytes = Vec::new(); + let mut current_char = [0u8; 1]; + loop { + input.read_exact(&mut current_char)?; + if current_char[0] == b'\n' { + break; + } else { + output_bytes.push(current_char[0]); + } + } + rv = std::str::from_utf8(&output_bytes[..]).unwrap().to_string(); + }, + }; let len = rv.trim_end_matches(&['\r', '\n'][..]).len(); rv.truncate(len); Ok(rv) From 5d73e34e3fb1da53d8dccb58c3812355e28005ca Mon Sep 17 00:00:00 2001 From: Mike Grunweg Date: Fri, 6 May 2022 18:34:39 +0200 Subject: [PATCH 3/4] Fix CI (hopefully). --- src/term.rs | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/term.rs b/src/term.rs index 0e73de7c..7a17a777 100644 --- a/src/term.rs +++ b/src/term.rs @@ -294,24 +294,31 @@ impl Term { return Ok("".into()); } let mut rv = String::new(); - match &self.inner.target { - TermTarget::Stdout | TermTarget::Stderr => { io::stdin().read_line(&mut rv)?; }, - TermTarget::ReadWritePair(ReadWritePair { read, .. }) => { - let mut input = read.lock().unwrap(); - // Read a single char until we hit a newline ("\n", an 0xA byte). - let mut output_bytes = Vec::new(); - let mut current_char = [0u8; 1]; - loop { - input.read_exact(&mut current_char)?; - if current_char[0] == b'\n' { - break; - } else { - output_bytes.push(current_char[0]); + #[cfg(not(unix))] { + io::stdin().read_line(&mut rv)?; + } + #[cfg(unix)] { + match &self.inner.target { + TermTarget::Stdout | TermTarget::Stderr => { + io::stdin().read_line(&mut rv)?; + }, + TermTarget::ReadWritePair(ReadWritePair { read, .. }) => { + let mut input = read.lock().unwrap(); + // Read a single char until we hit a newline ("\n", an 0xA byte). + let mut output_bytes = Vec::new(); + let mut current_char = [0u8; 1]; + loop { + input.read_exact(&mut current_char)?; + if current_char[0] == b'\n' { + break; + } else { + output_bytes.push(current_char[0]); + } } + rv = std::str::from_utf8(&output_bytes[..]).unwrap().to_string(); } - rv = std::str::from_utf8(&output_bytes[..]).unwrap().to_string(); - }, - }; + }; + } let len = rv.trim_end_matches(&['\r', '\n'][..]).len(); rv.truncate(len); Ok(rv) From 466401341c65a45265819baf1a943c3b8f8e6170 Mon Sep 17 00:00:00 2001 From: Mike Grunweg Date: Fri, 6 May 2022 18:39:47 +0200 Subject: [PATCH 4/4] More formatting fixes. --- src/term.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/term.rs b/src/term.rs index 7a17a777..680f307a 100644 --- a/src/term.rs +++ b/src/term.rs @@ -294,14 +294,16 @@ impl Term { return Ok("".into()); } let mut rv = String::new(); - #[cfg(not(unix))] { + #[cfg(not(unix))] + { io::stdin().read_line(&mut rv)?; } - #[cfg(unix)] { + #[cfg(unix)] + { match &self.inner.target { TermTarget::Stdout | TermTarget::Stderr => { io::stdin().read_line(&mut rv)?; - }, + } TermTarget::ReadWritePair(ReadWritePair { read, .. }) => { let mut input = read.lock().unwrap(); // Read a single char until we hit a newline ("\n", an 0xA byte).