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:
parent
af764f5eab
commit
832cf7b357
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -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"
|
||||
|
55
src/lib.rs
55
src/lib.rs
@ -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>,
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user