Skip to main content

bts/
utils.rs

1use crate::error::Error;
2use std::fs::DirEntry;
3use std::io;
4use std::path::Path;
5
6pub fn copy_dir_contents(
7    from: impl Iterator<Item = io::Result<DirEntry>>,
8    to: impl AsRef<Path>,
9    depth: u8,
10    max_depth: u8,
11) -> Result<(), Error> {
12    let mut from = from.peekable();
13    if depth >= max_depth || from.peek().is_none() {
14        return Ok(());
15    }
16
17    let to = to.as_ref();
18    if !to.exists() {
19        std::fs::create_dir_all(&to).map_err(Error::CopyError)?;
20    }
21
22    for entry in from {
23        let entry = match entry {
24            Ok(dir_entry) => dir_entry,
25            Err(e) => return Err(Error::Lookup(e)),
26        };
27
28        if entry.metadata().map_err(Error::Lookup)?.is_file() {
29            std::fs::copy(entry.path(), to.join(entry.file_name())).map_err(Error::CopyError)?;
30        } else {
31            copy_dir_contents(
32                std::fs::read_dir(entry.path()).map_err(Error::Lookup)?,
33                to.join(entry.file_name()),
34                depth + 1,
35                max_depth,
36            )?;
37        }
38    }
39
40    Ok(())
41}