Mercurial > hg
changeset 45366:10c36ead86f8
rhg: extract function handle_stdout_error
Avoid repeating the logic of handling stdout write errors.
Differential Revision: https://phab.mercurial-scm.org/D8870
author | Antoine Cezar <antoine.cezar@octobus.net> |
---|---|
date | Fri, 24 Jul 2020 17:24:10 +0200 |
parents | 26440adbe3e9 |
children | 53af26aa5951 |
files | rust/rhg/src/ui.rs |
diffstat | 1 files changed, 29 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/rhg/src/ui.rs Fri Jul 17 17:24:54 2020 +0200 +++ b/rust/rhg/src/ui.rs Fri Jul 24 17:24:10 2020 +0200 @@ -34,38 +34,23 @@ pub fn write_stdout(&self, bytes: &[u8]) -> Result<(), UiError> { let mut stdout = self.stdout.lock(); - self.write_stream(&mut stdout, bytes) - .or_else(|e| self.handle_stdout_error(e))?; - - stdout.flush().or_else(|e| self.handle_stdout_error(e)) - } + stdout + .write_all(bytes) + .or_else(|e| handle_stdout_error(e))?; - /// Sometimes writing to stdout is not possible, try writing to stderr to - /// signal that failure, otherwise just bail. - fn handle_stdout_error(&self, error: io::Error) -> Result<(), UiError> { - self.write_stderr( - &[b"abort: ", error.to_string().as_bytes(), b"\n"].concat(), - )?; - Err(UiError::StdoutError(error)) + stdout.flush().or_else(|e| handle_stdout_error(e)) } /// Write bytes to stderr pub fn write_stderr(&self, bytes: &[u8]) -> Result<(), UiError> { let mut stderr = self.stderr.lock(); - self.write_stream(&mut stderr, bytes) - .or_else(|e| Err(UiError::StderrError(e)))?; + stderr + .write_all(bytes) + .or_else(|e| handle_stderr_error(e))?; stderr.flush().or_else(|e| Err(UiError::StderrError(e))) } - - fn write_stream( - &self, - stream: &mut impl Write, - bytes: &[u8], - ) -> Result<(), io::Error> { - stream.write_all(bytes) - } } /// A buffered stdout writer for faster batch printing operations. @@ -81,29 +66,31 @@ /// Write bytes to stdout buffer pub fn write_all(&mut self, bytes: &[u8]) -> Result<(), UiError> { - self.buf.write_all(bytes).or_else(|e| self.io_err(e)) + self.buf + .write_all(bytes) + .or_else(|e| handle_stdout_error(e)) } /// Flush bytes to stdout pub fn flush(&mut self) -> Result<(), UiError> { - self.buf.flush().or_else(|e| self.io_err(e)) - } - - fn io_err(&self, error: io::Error) -> Result<(), UiError> { - if let ErrorKind::BrokenPipe = error.kind() { - // This makes `| head` work for example - return Ok(()); - } - let mut stderr = io::stderr(); - - stderr - .write_all( - &[b"abort: ", error.to_string().as_bytes(), b"\n"].concat(), - ) - .map_err(|e| UiError::StderrError(e))?; - - stderr.flush().map_err(|e| UiError::StderrError(e))?; - - Err(UiError::StdoutError(error)) + self.buf.flush().or_else(|e| handle_stdout_error(e)) } } + +/// Sometimes writing to stdout is not possible, try writing to stderr to +/// signal that failure, otherwise just bail. +fn handle_stdout_error(error: io::Error) -> Result<(), UiError> { + if let ErrorKind::BrokenPipe = error.kind() { + // This makes `| head` work for example + return Ok(()); + } + let mut stderr = io::stderr(); + + stderr + .write_all(&[b"abort: ", error.to_string().as_bytes(), b"\n"].concat()) + .map_err(|e| UiError::StderrError(e))?; + + stderr.flush().map_err(|e| UiError::StderrError(e))?; + + Err(UiError::StdoutError(error)) +}