spin_templates/
directory.rs

1use std::path::{Path, PathBuf};
2
3use anyhow::Context;
4
5pub(crate) fn subdirectories(dir: &Path) -> anyhow::Result<Vec<PathBuf>> {
6    let dir_entries = std::fs::read_dir(dir)
7        .with_context(|| format!("Failed to read contents of '{}' directory", dir.display()))?;
8    let directories = dir_entries
9        .filter_map(as_dir_path)
10        .collect::<Result<Vec<_>, _>>()
11        .with_context(|| {
12            format!(
13                "Failed to find subdirectories of '{}' directory",
14                dir.display()
15            )
16        })?;
17    Ok(directories)
18}
19
20fn as_dir_path(dir_entry: std::io::Result<std::fs::DirEntry>) -> Option<std::io::Result<PathBuf>> {
21    match dir_entry {
22        Err(e) => Some(Err(e)),
23        Ok(entry) => match entry.file_type() {
24            Err(e) => Some(Err(e)),
25            Ok(ty) => {
26                if ty.is_dir() {
27                    Some(Ok(entry.path()))
28                } else {
29                    None
30                }
31            }
32        },
33    }
34}