aboutsummaryrefslogtreecommitdiff
path: root/crates/fparkan-path/src/lib.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-06-22 15:41:21 +0300
committerValentin Popov <valentin@popov.link>2026-06-22 15:41:21 +0300
commit8b91a0bfbf0097d145359c8508a61696ade812d1 (patch)
tree3e0f3c1c72034b13b73260fca204c101fc7aa379 /crates/fparkan-path/src/lib.rs
parentfb97405e0c47dadf656e5c92c76ddaff95d78222 (diff)
downloadfparkan-8b91a0bfbf0097d145359c8508a61696ade812d1.tar.xz
fparkan-8b91a0bfbf0097d145359c8508a61696ade812d1.zip
fix: make core error displays actionable
Diffstat (limited to 'crates/fparkan-path/src/lib.rs')
-rw-r--r--crates/fparkan-path/src/lib.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/crates/fparkan-path/src/lib.rs b/crates/fparkan-path/src/lib.rs
index f59fda0..330b03a 100644
--- a/crates/fparkan-path/src/lib.rs
+++ b/crates/fparkan-path/src/lib.rs
@@ -97,7 +97,14 @@ pub enum PathError {
impl fmt::Display for PathError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{self:?}")
+ match self {
+ Self::Empty => write!(f, "path is empty"),
+ Self::EmbeddedNul => write!(f, "path contains an embedded NUL byte"),
+ Self::Absolute => write!(f, "path must be relative and cannot be absolute"),
+ Self::ParentTraversal => write!(f, "path attempts to traverse outside its root"),
+ Self::EscapesRoot => write!(f, "normalized path escapes the configured root"),
+ Self::InvalidUtf8 => write!(f, "path is not valid UTF-8 after normalization"),
+ }
}
}
@@ -230,6 +237,18 @@ mod tests {
}
#[test]
+ fn path_error_display_is_actionable() {
+ assert_eq!(
+ PathError::ParentTraversal.to_string(),
+ "path attempts to traverse outside its root"
+ );
+ assert_eq!(
+ PathError::EmbeddedNul.to_string(),
+ "path contains an embedded NUL byte"
+ );
+ }
+
+ #[test]
fn strict_legacy_rejects_host_only_segments() {
assert_eq!(
normalize_relative(b"./DATA/MAPS", PathPolicy::StrictLegacy),