pub enum PatchError {
PathTraversal(PathBuf),
TargetNotFound(PathBuf),
PermissionDenied {
path: PathBuf,
},
TargetIsDirectory {
path: PathBuf,
},
Io {
path: PathBuf,
source: Error,
},
}Expand description
Represents “hard” errors that can occur during patch operations.
This error type is returned by functions like apply_patch_to_file() for
unrecoverable issues such as I/O errors, permission problems, or security
violations like path traversal. It is distinct from a partial apply, which
is handled by the result structs.
§Examples
let dir = tempdir()?;
// Note: "missing.txt" does not exist in the directory.
let diff = r#"
```diff
--- a/missing.txt
+++ b/missing.txt
@@ -1 +1 @@
-foo
+bar
```
"#;
let patch = parse_single_patch(diff)?;
let options = ApplyOptions::new();
// This will fail because the target file doesn't exist and it's not a creation patch.
let result = apply_patch_to_file(&patch, dir.path(), options);
assert!(matches!(result, Err(PatchError::TargetNotFound(_))));Variants§
PathTraversal(PathBuf)
The patch attempted to access a path outside the target directory.
This is a security measure to prevent malicious patches from modifying
unintended files (e.g., --- a/../../etc/passwd).
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::PathTraversal(PathBuf::from("../../etc/passwd"));TargetNotFound(PathBuf)
The target file for a patch could not be found, and the patch did not appear to be for file creation (i.e., its first hunk was not an addition-only hunk).
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::TargetNotFound(PathBuf::from("missing.txt"));PermissionDenied
The user does not have permission to read or write to the specified path.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::PermissionDenied { path: PathBuf::from("readonly.txt") };Fields
path: PathBufThe path that could not be accessed.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::PermissionDenied { path: PathBuf::from("readonly.txt") };
match err {
PatchError::PermissionDenied { path } => assert_eq!(path.to_str(), Some("readonly.txt")),
_ => unreachable!(),
}TargetIsDirectory
The target path for a patch exists but is a directory, not a file.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::TargetIsDirectory { path: PathBuf::from("src/") };Fields
path: PathBufThe path that resolved to a directory.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
let err = PatchError::TargetIsDirectory { path: PathBuf::from("src/") };
match err {
PatchError::TargetIsDirectory { path } => assert_eq!(path.to_str(), Some("src/")),
_ => unreachable!(),
}Io
An I/O error occurred while reading or writing a file. This is a “hard” error that stops the entire process.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
use std::io::{Error, ErrorKind};
let err = PatchError::Io { path: PathBuf::from("file.txt"), source: Error::new(ErrorKind::Other, "oh no") };Fields
path: PathBufThe path associated with the I/O error.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
use std::io::{Error, ErrorKind};
let err = PatchError::Io { path: PathBuf::from("file.txt"), source: Error::new(ErrorKind::Other, "oh no") };
match err {
PatchError::Io { path, .. } => assert_eq!(path.to_str(), Some("file.txt")),
_ => unreachable!(),
}source: ErrorThe underlying I/O error.
§Examples
use mpatch::PatchError;
use std::path::PathBuf;
use std::io::{Error, ErrorKind};
let err = PatchError::Io { path: PathBuf::from("file.txt"), source: Error::new(ErrorKind::Other, "oh no") };
match err {
PatchError::Io { source, .. } => assert_eq!(source.kind(), ErrorKind::Other),
_ => unreachable!(),
}Trait Implementations§
Source§impl Debug for PatchError
impl Debug for PatchError
Source§impl Display for PatchError
impl Display for PatchError
Source§impl Error for PatchError
impl Error for PatchError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Source§impl From<PatchError> for StrictApplyError
impl From<PatchError> for StrictApplyError
Source§fn from(source: PatchError) -> Self
fn from(source: PatchError) -> Self
Auto Trait Implementations§
impl Freeze for PatchError
impl !RefUnwindSafe for PatchError
impl Send for PatchError
impl Sync for PatchError
impl Unpin for PatchError
impl UnsafeUnpin for PatchError
impl !UnwindSafe for PatchError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more