#path #clean

clean-path

A safe fork of the path-clean crate

2 releases

Uses old Rust 2015

0.2.1 Jun 2, 2022
0.2.0 May 15, 2022

#118 in Build Utils

Download history 11/week @ 2022-06-06 8/week @ 2022-06-13 53/week @ 2022-06-20 123/week @ 2022-06-27 45/week @ 2022-07-04 214/week @ 2022-07-11 262/week @ 2022-07-18 199/week @ 2022-07-25 161/week @ 2022-08-01 189/week @ 2022-08-08 417/week @ 2022-08-15 425/week @ 2022-08-22 465/week @ 2022-08-29 476/week @ 2022-09-05 692/week @ 2022-09-12 707/week @ 2022-09-19

2,341 downloads per month
Used in 4 crates (2 directly)

MIT/Apache

12KB
164 lines

clean-path

crates.io version docs.rs docs license

clean-path is a safe fork of the path-clean crate.

Installation

cargo add clean-path

Usage

use std::path::{Path, PathBuf};
use clean_path::{clean, Clean};

assert_eq!(clean("foo/../../bar"), PathBuf::from("../bar"));
assert_eq!(Path::new("hello/world/..").clean(), PathBuf::from("hello"));
assert_eq!(
    PathBuf::from("/test/../path/").clean(),
    PathBuf::from("/path")
);

About

This fork aims to provide the same utility as path-clean, without using unsafe. Additionally, the api is improved ([clean] takes AsRef<Path> instead of just &str) and Clean is implemented on Path in addition to just PathBuf.

The main cleaning procedure is implemented using the methods provided by PathBuf, thus it should bring portability benefits over path-clean w.r.t. correctly handling cross-platform filepaths.

Additionally, the original implementation in path-clean is rather inscrutible, and as such if being able to inspect and understand the code is important to you, this crate provides a more readable implementation.

However, the current implementation is not highly-optimized, so if performance is top-priority, consider using path-clean instead.

Specification

The cleaning works as follows:

  1. Reduce multiple slashes to a single slash.
  2. Eliminate . path name elements (the current directory).
  3. Eliminate .. path name elements (the parent directory) and the non-. non-.., element that precedes them.
  4. Eliminate .. elements that begin a rooted path, that is, replace /.. by / at the beginning of a path.
  5. Leave intact .. elements that begin a non-rooted path.

If the result of this process is an empty string, return the string ".", representing the current directory.

This transformation is performed lexically, without touching the filesystem. Therefore it doesn't do any symlink resolution or absolute path resolution. For more information you can see "Getting Dot-Dot Right".

This functionality is exposed in the [clean] function and [Clean] trait implemented for [std::path::PathBuf] and [std::path::Path].

License

MIT OR Apache-2.0

No runtime deps