spin_templates/
directory.rs1use 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}