mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-04-24 17:12:16 +02:00
ignore: impl Clone for DirEntry
There is a small hiccup here in that a `DirEntry` can embed errors associated with reading an ignore file, which can be accessed and logged by consumers if desired. That error type can contain an io::Error, which isn't cloneable. We therefore implement Clone on our library's error type in a way that re-creates the I/O error as best as possible. Fixes #891
This commit is contained in:
parent
58bd0c67da
commit
ebdb7c1d4c
@ -132,6 +132,44 @@ pub enum Error {
|
|||||||
InvalidDefinition,
|
InvalidDefinition,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Clone for Error {
|
||||||
|
fn clone(&self) -> Error {
|
||||||
|
match *self {
|
||||||
|
Error::Partial(ref errs) => Error::Partial(errs.clone()),
|
||||||
|
Error::WithLineNumber { line, ref err } => {
|
||||||
|
Error::WithLineNumber { line: line, err: err.clone() }
|
||||||
|
}
|
||||||
|
Error::WithPath { ref path, ref err } => {
|
||||||
|
Error::WithPath { path: path.clone(), err: err.clone() }
|
||||||
|
}
|
||||||
|
Error::WithDepth { depth, ref err } => {
|
||||||
|
Error::WithDepth { depth: depth, err: err.clone() }
|
||||||
|
}
|
||||||
|
Error::Loop { ref ancestor, ref child } => {
|
||||||
|
Error::Loop {
|
||||||
|
ancestor: ancestor.clone(),
|
||||||
|
child: child.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Error::Io(ref err) => {
|
||||||
|
match err.raw_os_error() {
|
||||||
|
Some(e) => Error::Io(io::Error::from_raw_os_error(e)),
|
||||||
|
None => {
|
||||||
|
Error::Io(io::Error::new(err.kind(), err.to_string()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Error::Glob { ref glob, ref err } => {
|
||||||
|
Error::Glob { glob: glob.clone(), err: err.clone() }
|
||||||
|
}
|
||||||
|
Error::UnrecognizedFileType(ref err) => {
|
||||||
|
Error::UnrecognizedFileType(err.clone())
|
||||||
|
}
|
||||||
|
Error::InvalidDefinition => Error::InvalidDefinition,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Error {
|
impl Error {
|
||||||
/// Returns true if this is a partial error.
|
/// Returns true if this is a partial error.
|
||||||
///
|
///
|
||||||
|
@ -24,7 +24,7 @@ use {Error, PartialErrorBuilder};
|
|||||||
///
|
///
|
||||||
/// The error typically refers to a problem parsing ignore files in a
|
/// The error typically refers to a problem parsing ignore files in a
|
||||||
/// particular directory.
|
/// particular directory.
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct DirEntry {
|
pub struct DirEntry {
|
||||||
dent: DirEntryInner,
|
dent: DirEntryInner,
|
||||||
err: Option<Error>,
|
err: Option<Error>,
|
||||||
@ -126,7 +126,7 @@ impl DirEntry {
|
|||||||
///
|
///
|
||||||
/// Specifically, (3) has to essentially re-create the DirEntry implementation
|
/// Specifically, (3) has to essentially re-create the DirEntry implementation
|
||||||
/// from WalkDir.
|
/// from WalkDir.
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug)]
|
||||||
enum DirEntryInner {
|
enum DirEntryInner {
|
||||||
Stdin,
|
Stdin,
|
||||||
Walkdir(walkdir::DirEntry),
|
Walkdir(walkdir::DirEntry),
|
||||||
@ -235,6 +235,7 @@ impl DirEntryInner {
|
|||||||
|
|
||||||
/// DirEntryRaw is essentially copied from the walkdir crate so that we can
|
/// DirEntryRaw is essentially copied from the walkdir crate so that we can
|
||||||
/// build `DirEntry`s from whole cloth in the parallel iterator.
|
/// build `DirEntry`s from whole cloth in the parallel iterator.
|
||||||
|
#[derive(Clone)]
|
||||||
struct DirEntryRaw {
|
struct DirEntryRaw {
|
||||||
/// The path as reported by the `fs::ReadDir` iterator (even if it's a
|
/// The path as reported by the `fs::ReadDir` iterator (even if it's a
|
||||||
/// symbolic link).
|
/// symbolic link).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user