Simplify stdout handling

pull/82/head
sharkdp 6 years ago committed by David Peter
parent 438f3df345
commit 9a0e444e09

@ -23,7 +23,7 @@ mod terminal;
use std::collections::HashMap; use std::collections::HashMap;
use std::env; use std::env;
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::{self, BufRead, BufReader, Stdout, StdoutLock, Write}; use std::io::{self, BufRead, BufReader, Write};
use std::path::Path; use std::path::Path;
use std::process::{self, Child, Command, Stdio}; use std::process::{self, Child, Command, Stdio};
@ -69,12 +69,12 @@ pub struct Options<'a> {
pub paging: bool, pub paging: bool,
} }
enum OutputType<'a> { enum OutputType {
Pager(Child), Pager(Child),
Stdout(StdoutLock<'a>), Stdout(io::Stdout),
} }
impl<'a> OutputType<'a> { impl OutputType {
fn pager() -> Result<Self> { fn pager() -> Result<Self> {
Ok(OutputType::Pager(Command::new("less") Ok(OutputType::Pager(Command::new("less")
.args(&["--quit-if-one-screen", "--RAW-CONTROL-CHARS", "--no-init"]) .args(&["--quit-if-one-screen", "--RAW-CONTROL-CHARS", "--no-init"])
@ -83,8 +83,8 @@ impl<'a> OutputType<'a> {
.chain_err(|| "Could not spawn pager")?)) .chain_err(|| "Could not spawn pager")?))
} }
fn stdout(stdout: &'a Stdout) -> Self { fn stdout() -> Self {
OutputType::Stdout(stdout.lock()) OutputType::Stdout(io::stdout())
} }
fn handle(&mut self) -> Result<&mut Write> { fn handle(&mut self) -> Result<&mut Write> {
@ -98,7 +98,7 @@ impl<'a> OutputType<'a> {
} }
} }
impl<'a> Drop for OutputType<'a> { impl Drop for OutputType {
fn drop(&mut self) { fn drop(&mut self) {
if let OutputType::Pager(ref mut command) = *self { if let OutputType::Pager(ref mut command) = *self {
let _ = command.wait(); let _ = command.wait();
@ -259,14 +259,11 @@ fn get_git_diff(filename: &str) -> Option<LineChanges> {
Some(line_changes) Some(line_changes)
} }
fn get_output_type(stdout: &Stdout, paging: bool) -> OutputType { fn get_output_type(paging: bool) -> OutputType {
if paging { if paging {
match OutputType::pager() { OutputType::pager().unwrap_or_else(|_| OutputType::stdout())
Ok(pager) => pager,
Err(_) => OutputType::stdout(&stdout),
}
} else { } else {
OutputType::stdout(&stdout) OutputType::stdout()
} }
} }
@ -508,8 +505,7 @@ fn run() -> Result<()> {
}) })
.unwrap_or_else(|| vec![None]); // read from stdin (None) if no args are given .unwrap_or_else(|| vec![None]); // read from stdin (None) if no args are given
let stdout = io::stdout(); let mut output_type = get_output_type(options.paging);
let mut output_type = get_output_type(&stdout, options.paging);
let handle = output_type.handle()?; let handle = output_type.handle()?;
let mut printer = Printer::new(handle, &options); let mut printer = Printer::new(handle, &options);

@ -95,8 +95,6 @@ impl<'a> Printer<'a> {
.join(" ") .join(" ")
)?; )?;
self.handle.flush()?;
Ok(()) Ok(())
} }

Loading…
Cancel
Save