use std::path::{Path, PathBuf};
use crate::pre::*;
pub fn glob_from(path: impl AsRef<Path>, pattern: &str) -> crate::Result<Glob> {
let path = path.as_ref().join(pattern);
let pattern = crate::check!(
path.into_utf8(),
"base path is not UTF-8 while trying to glob: {pattern}"
)?;
glob(&pattern)
}
pub fn glob(pattern: &str) -> crate::Result<Glob> {
let iter = crate::check!(
::glob::glob(pattern),
"failed to parse glob pattern: {pattern}"
)?;
Ok(Glob(iter))
}
pub struct Glob(::glob::Paths);
impl Iterator for Glob {
type Item = crate::Result<PathBuf>;
fn next(&mut self) -> Option<Self::Item> {
match self.0.next()? {
Ok(p) => Some(Ok(p)),
Err(e) => {
let path = e.path();
let outer = crate::fmterr!("glob: cannot read '{}'", path.display());
Some(Err(e.into_error()).context(outer))
}
}
}
}