use cosh_tools::find::{Find, GlobCallOptions};
fn show(label: &str, result: Result<cosh_tools::find::GlobOutput, String>) {
println!("== {label} ==");
match result {
Ok(out) => {
for m in &out.matches {
let size = match m.size_bytes {
Some(n) => format!("{n} bytes"),
None => "size n/a".to_string(),
};
println!(" {} ({}, {size})", m.path, m.file_type);
}
if let Some(note) = &out.note {
println!(" note: {note}");
}
println!(
" scope={} total={} useless={:?} limit_reached={:?} timed_out={:?}",
out.scope, out.total, out.useless, out.limit_reached, out.timed_out
);
}
Err(e) => println!(" ERROR: {e}"),
}
println!();
}
fn sorted() -> GlobCallOptions {
GlobCallOptions {
sort_by_mtime: Some(false),
..Default::default()
}
}
fn main() {
let project = std::env::temp_dir().join("cosh-find-glob-example");
let _ = std::fs::remove_dir_all(&project);
for dir in ["src/util", "src/bin", "tests", "docs"] {
std::fs::create_dir_all(project.join(dir)).unwrap();
}
std::fs::write(project.join("src/lib.rs"), "fn lib() {}\n").unwrap();
std::fs::write(project.join("src/main.rs"), "fn main() {}\n").unwrap();
std::fs::write(project.join("src/util/helper.rs"), "fn helper() {}\n").unwrap();
std::fs::write(project.join("src/bin/tool.rs"), "fn tool() {}\n").unwrap();
std::fs::write(project.join("tests/it.rs"), "#[test] fn t() {}\n").unwrap();
std::fs::write(project.join("docs/guide.md"), "# Guide\n").unwrap();
std::fs::write(project.join("README.md"), "# scratch\n").unwrap();
std::fs::write(project.join(".gitignore"), "# build\n").unwrap();
std::fs::write(project.join("src/.hidden.rs"), "// hidden\n").unwrap();
let find = Find::new().cwd(&project);
show(
"bare glob target `*.rs`",
find.glob_full(
"",
Some("*.rs".into()),
None,
GlobCallOptions::default(),
None,
),
);
show(
"pattern `*.rs` over dir target `src`",
find.glob_full("*.rs", Some("src".into()), None, sorted(), None),
);
show(
"pattern `**/*.rs` over dir target `src`",
find.glob_full("**/*.rs", Some("src".into()), None, sorted(), None),
);
show(
"scoped glob target `src/*.rs`",
find.glob_full("", Some("src/*.rs".into()), None, sorted(), None),
);
show(
"directories only under `src`",
find.glob_full(
"**",
Some("src".into()),
None,
GlobCallOptions {
file_type: Some("dir".into()),
..sorted()
},
None,
),
);
let tree = find
.glob_full(
"**/*.rs",
Some("src".into()),
None,
GlobCallOptions {
format: Some("tree".into()),
..sorted()
},
None,
)
.unwrap();
println!("== tree format ==");
println!("{}", tree.formatted);
println!();
show(
"multi-target `paths = [src, tests]`",
find.glob_full(
"*.rs",
None,
Some(vec!["src".into(), "tests".into()]),
sorted(),
None,
),
);
show(
"one missing target",
find.glob_full(
"*.rs",
None,
Some(vec!["src".into(), "nope".into()]),
sorted(),
None,
),
);
show(
"all targets missing",
find.glob_full(
"*.rs",
Some("nope".into()),
None,
GlobCallOptions::default(),
None,
),
);
show(
"file literal target `src/lib.rs`",
find.glob_full("", Some("src/lib.rs".into()), None, sorted(), None),
);
}