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}