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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/// ## Quick start
///
/// ```sh
/// cargo install swdir
/// ```
///
/// ```rust
/// use swdir::Swdir;
///
/// fn run() {
/// let dir_node = Swdir::default().set_root_path("/some/path").walk();
/// // -> DirNode (files and subdirectories)
/// // -> flatten_paths() returns Vec<PathBuf>
/// }
/// ```
///
/// ### Recurse option
///
/// ```rust
/// use swdir::{Recurse, Swdir};
///
/// fn run() {
/// let recurse = Recurse {
/// enabled: true,
/// depth_limit: Some(1), // only first level subdirectory is scanned
/// };
///
/// let dir_node = Swdir::default()
/// .set_root_path("/some/path")
/// .set_recurse(recurse)
/// .include_hidden() // don't skip hidden files and directories
/// .walk();
/// }
/// ```
///
/// ### Allowlist and denylist
///
/// ```rust
/// use swdir::{Swdir, SwdirError};
///
/// fn run() -> Result<(), SwdirError> {
/// let dir_node_with_allowlist = Swdir::default()
/// .set_root_path("/some/path")
/// .set_extension_allowlist(&["md"])?
/// .walk();
///
/// let dir_node_with_denylist = Swdir::default()
/// .set_root_path("/some/path")
/// .set_extension_denylist(&["md"])?
/// .walk();
///
/// Ok(())
/// }
/// ```
/// ## Quick start
///
/// ```sh
/// cargo install swdir
/// ```
///
/// ```rust
/// use swdir::Swdir;
///
/// fn run() {
/// let dir_node = Swdir::default().set_root_path("/some/path").walk();
/// // -> DirNode (files and subdirectories)
/// // -> flatten_paths() returns Vec<PathBuf>
/// }
/// ```
///
/// ### Recurse option
///
/// ```rust
/// use swdir::{Recurse, Swdir};
///
/// fn run() {
/// let recurse = Recurse {
/// enabled: true,
/// depth_limit: Some(1), // only first level subdirectory is scanned
/// };
///
/// let dir_node = Swdir::default()
/// .set_root_path("/some/path")
/// .set_recurse(recurse)
/// .include_hidden() // don't skip hidden files and directories
/// .walk();
/// }
/// ```
///
/// ### Allowlist and denylist
///
/// ```rust
/// use swdir::{Swdir, SwdirError};
///
/// fn run() -> Result<(), SwdirError> {
/// let dir_node_with_allowlist = Swdir::default()
/// .set_root_path("/some/path")
/// .set_extension_allowlist(&["md"])?
/// .walk();
///
/// let dir_node_with_denylist = Swdir::default()
/// .set_root_path("/some/path")
/// .set_extension_denylist(&["md"])?
/// .walk();
///
/// Ok(())
/// }
/// ```
///
/// ### Single-directory scan (GUI / lazy loading)
///
/// For GUIs that expand one directory at a time (iced tree views,
/// file pickers, etc.), use the low-level [`scan_dir`] function
/// instead of [`Swdir::walk`]. It lists one level, does no filtering
/// or sorting, and uses neither rayon nor async — wrap it with
/// `std::thread::spawn` from whichever runtime you use.
///
/// ```rust
/// use std::path::Path;
/// use swdir::scan_dir;
///
/// fn run() -> Result<(), swdir::ScanError> {
/// let entries = scan_dir(Path::new("."))?;
/// for entry in entries {
/// if entry.is_dir() {
/// // expand on user click...
/// }
/// }
/// Ok(())
/// }
/// ```
pub use crate::;