Struct grep_cli::DecompressionReader [−][src]
pub struct DecompressionReader { /* fields omitted */ }A streaming reader for decompressing the contents of a file.
The purpose of this reader is to provide a seamless way to decompress the
contents of file using existing tools in the current environment. This is
meant to be an alternative to using decompression libraries in favor of the
simplicity and portability of using external commands such as gzip and
xz. This does impose the overhead of spawning a process, so other means
for performing decompression should be sought if this overhead isn't
acceptable.
A decompression reader comes with a default set of matching rules that are
meant to associate file paths with the corresponding command to use to
decompress them. For example, a glob like *.gz matches gzip compressed
files with the command gzip -d -c. If a file path does not match any
existing rules, or if it matches a rule whose command does not exist in the
current environment, then the decompression reader passes through the
contents of the underlying file without doing any decompression.
The default matching rules are probably good enough for most cases, and if
they require revision, pull requests are welcome. In cases where they must
be changed or extended, they can be customized through the use of
DecompressionMatcherBuilder
and
DecompressionReaderBuilder.
By default, this reader will asynchronously read the processes' stderr. This prevents subtle deadlocking bugs for noisy processes that write a lot to stderr. Currently, the entire contents of stderr is read on to the heap.
Example
This example shows how to read the decompressed contents of a file without needing to explicitly choose the decompression command to run.
Note that if you need to decompress multiple files, it is better to use
DecompressionReaderBuilder, which will amortize the cost of compiling the
matcher.
use std::io::Read; use std::process::Command; use grep_cli::DecompressionReader; let mut rdr = DecompressionReader::new("/usr/share/man/man1/ls.1.gz")?; let mut contents = vec![]; rdr.read_to_end(&mut contents)?;
Methods
impl DecompressionReader[src]
impl DecompressionReaderpub fn new<P: AsRef<Path>>(path: P) -> Result<DecompressionReader, CommandError>[src]
pub fn new<P: AsRef<Path>>(path: P) -> Result<DecompressionReader, CommandError>Build a new streaming reader for decompressing data.
If decompression is done out-of-process and if there was a problem spawning the process, then its error is returned.
If the given file path could not be matched with a decompression strategy, then a passthru reader is returned that does no decompression.
This uses the default matching rules for determining how to decompress
the given file. To change those matching rules, use
DecompressionReaderBuilder
and
DecompressionMatcherBuilder.
When creating readers for many paths. it is better to use the builder since it will amortize the cost of constructing the matcher.
Trait Implementations
impl Debug for DecompressionReader[src]
impl Debug for DecompressionReaderfn fmt(&self, f: &mut Formatter) -> Result[src]
fn fmt(&self, f: &mut Formatter) -> ResultFormats the value using the given formatter. Read more
impl Read for DecompressionReader[src]
impl Read for DecompressionReaderfn read(&mut self, buf: &mut [u8]) -> Result<usize>[src]
fn read(&mut self, buf: &mut [u8]) -> Result<usize>Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
unsafe fn initializer(&self) -> Initializer[src]
unsafe fn initializer(&self) -> Initializerread_initializer)Determines if this Reader can work with buffers of uninitialized memory. Read more
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>1.0.0[src]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>Read all bytes until EOF in this source, placing them into buf. Read more
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>1.0.0[src]
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>Read all bytes until EOF in this source, appending them to buf. Read more
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>1.6.0[src]
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>Read the exact number of bytes required to fill buf. Read more
fn by_ref(&mut self) -> &mut Self1.0.0[src]
fn by_ref(&mut self) -> &mut SelfCreates a "by reference" adaptor for this instance of Read. Read more
fn bytes(self) -> Bytes<Self>1.0.0[src]
fn bytes(self) -> Bytes<Self>Transforms this Read instance to an [Iterator] over its bytes. Read more
fn chars(self) -> Chars<Self>[src]
fn chars(self) -> Chars<Self>: Use str::from_utf8 instead: https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html#examples
🔬 This is a nightly-only experimental API. (io)
the semantics of a partial read/write of where errors happen is currently unclear and may change
Transforms this Read instance to an [Iterator] over [char]s. Read more
fn chain<R>(self, next: R) -> Chain<Self, R> where
R: Read, 1.0.0[src]
fn chain<R>(self, next: R) -> Chain<Self, R> where
R: Read, Creates an adaptor which will chain this stream with another. Read more
fn take(self, limit: u64) -> Take<Self>1.0.0[src]
fn take(self, limit: u64) -> Take<Self>Creates an adaptor which will read at most limit bytes from it. Read more
Auto Trait Implementations
impl Send for DecompressionReader
impl Send for DecompressionReaderimpl Sync for DecompressionReader
impl Sync for DecompressionReader