1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//! Cross-platform path manipulation.

//!

//! This module is an async version of [`std::path`].

//!

//! This module provides two types, [`PathBuf`] and [`Path`][`Path`] (akin to [`String`]

//! and [`str`]), for working with paths abstractly. These types are thin wrappers

//! around [`OsString`] and [`OsStr`] respectively, meaning that they work directly

//! on strings according to the local platform's path syntax.

//!

//! Paths can be parsed into [`Component`]s by iterating over the structure

//! returned by the [`components`] method on [`Path`]. [`Component`]s roughly

//! correspond to the substrings between path separators (`/` or `\`). You can

//! reconstruct an equivalent path from components with the [`push`] method on

//! [`PathBuf`]; note that the paths may differ syntactically by the

//! normalization described in the documentation for the [`components`] method.

//!

//! [`std::path`]: https://doc.rust-lang.org/std/path/index.html

//!

//! ## Simple usage

//!

//! Path manipulation includes both parsing components from slices and building

//! new owned paths.

//!

//! To parse a path, you can create a [`Path`] slice from a [`str`]

//! slice and start asking questions:

//!

//! ```

//! use async_std::path::Path;

//! use std::ffi::OsStr;

//!

//! let path = Path::new("/tmp/foo/bar.txt");

//!

//! let parent = path.parent();

//! assert_eq!(parent, Some(Path::new("/tmp/foo")));

//!

//! let file_stem = path.file_stem();

//! assert_eq!(file_stem, Some(OsStr::new("bar")));

//!

//! let extension = path.extension();

//! assert_eq!(extension, Some(OsStr::new("txt")));

//! ```

//!

//! To build or modify paths, use [`PathBuf`]:

//!

//! ```

//! use async_std::path::PathBuf;

//!

//! // This way works...

//! let mut path = PathBuf::from("c:\\");

//!

//! path.push("windows");

//! path.push("system32");

//!

//! path.set_extension("dll");

//!

//! // ... but push is best used if you don't know everything up

//! // front. If you do, this way is better:

//! let path: PathBuf = ["c:\\", "windows", "system32.dll"].iter().collect();

//! ```

//!

//! [`Component`]: enum.Component.html

//! [`components`]: struct.Path.html#method.components

//! [`PathBuf`]: struct.PathBuf.html

//! [`Path`]: struct.Path.html

//! [`push`]: struct.PathBuf.html#method.push

//! [`String`]: https://doc.rust-lang.org/std/string/struct.String.html

//!

//! [`str`]: https://doc.rust-lang.org/std/primitive.str.html

//! [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html

//! [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html


mod ancestors;
mod components;
mod iter;
mod path;
mod pathbuf;

#[doc(inline)]
pub use std::path::{
    is_separator, Component, Display, Prefix, PrefixComponent, StripPrefixError, MAIN_SEPARATOR,
};

pub use ancestors::Ancestors;
pub use components::Components;
pub use iter::Iter;
pub use path::Path;
pub use pathbuf::PathBuf;