Move output() and OutputError into brev (#187)

They're pretty generic and generally useful, so move them into brev on crates.io.
This commit is contained in:
Casey Rodarmor 2017-04-23 15:37:17 -07:00 committed by GitHub
parent af764f5eab
commit 832cf7b357
3 changed files with 7 additions and 56 deletions

6
Cargo.lock generated
View File

@ -4,7 +4,7 @@ version = "0.2.26"
dependencies = [
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"brev 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"brev 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.23.3 (registry+https://github.com/rust-lang/crates.io-index)",
"edit-distance 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
@ -45,7 +45,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "brev"
version = "0.1.8"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
@ -217,7 +217,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
"checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
"checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
"checksum brev 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "363b8e31f04a5c26761f0a01da8f46eb172485d029a01042ad07fc01faef62ad"
"checksum brev 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "eb37ce3b65873276d1587151ef5b63bcc15c8da8dd5058792f5660cb32206d97"
"checksum clap 2.23.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f57e9b63057a545ad2ecd773ea61e49422ed1b1d63d74d5da5ecaee55b3396cd"
"checksum edit-distance 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd50a61206c09132fdf9cbaccc64a82cfccb6be528453903e03d4eb4ec80a61d"
"checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"

View File

@ -7,6 +7,7 @@ extern crate ansi_term;
extern crate unicode_width;
extern crate edit_distance;
extern crate libc;
extern crate brev;
#[cfg(test)]
mod unit;
@ -34,11 +35,12 @@ use prelude::*;
pub use app::app;
use app::UseColor;
use brev::{output, OutputError};
use platform::{Platform, PlatformInterface};
use std::borrow::Cow;
use std::collections::{BTreeMap as Map, BTreeSet as Set};
use std::fmt::Display;
use std::ops::Range;
use platform::{Platform, PlatformInterface};
macro_rules! warn {
($($arg:tt)*) => {{
@ -101,48 +103,6 @@ fn contains<T: PartialOrd>(range: &Range<T>, i: T) -> bool {
i >= range.start && i < range.end
}
#[derive(Debug)]
enum OutputError {
/// Non-zero exit code
Code(i32),
/// IO error upon execution
Io(io::Error),
/// Terminated by signal
Signal(i32),
/// Unknown failure
Unknown,
/// Stdtout not UTF-8
Utf8(std::str::Utf8Error),
}
/// Run a command and return the data it wrote to stdout as a string
fn output(mut command: process::Command) -> Result<String, OutputError> {
match command.output() {
Ok(output) => {
if let Some(code) = output.status.code() {
if code != 0 {
return Err(OutputError::Code(code));
}
} else {
return Err(output_error_from_signal(output.status));
}
match std::str::from_utf8(&output.stdout) {
Err(error) => Err(OutputError::Utf8(error)),
Ok(utf8) => {
Ok(if utf8.ends_with('\n') {
&utf8[0..utf8.len()-1]
} else if utf8.ends_with("\r\n") {
&utf8[0..utf8.len()-2]
} else {
utf8
}.to_string())
}
}
}
Err(io_error) => Err(OutputError::Io(io_error)),
}
}
#[derive(PartialEq, Debug)]
struct Recipe<'a> {
dependencies: Vec<&'a str>,
@ -257,15 +217,6 @@ fn error_from_signal(
}
}
/// Return an OutputError::Signal if the process was terminated by signal,
/// otherwise return an OutputError::UnknownFailure
fn output_error_from_signal(exit_status: process::ExitStatus) -> OutputError {
match Platform::signal_from_exit_status(exit_status) {
Some(signal) => OutputError::Signal(signal),
None => OutputError::Unknown,
}
}
fn export_env<'a>(
command: &mut process::Command,
scope: &Map<&'a str, String>,

View File

@ -75,7 +75,7 @@ impl PlatformInterface for Platform {
fn signal_from_exit_status(_exit_status: process::ExitStatus) -> Option<i32> {
// The rust standard library does not expose a way to extract a signal
// from a process exit status, so just return None
// from a windows process exit status, so just return None
None
}
}