1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use std::path::PathBuf;
use crate::FileMover;
pub fn sample(
mover: &dyn FileMover,
pattern: &glob::Pattern,
source: &str,
nth: u32,
) -> Result<(), Box<dyn std::error::Error>> {
let source_directory = PathBuf::from(source);
let destination_directory = PathBuf::from("sampled");
let mut files: Vec<_> = std::fs::read_dir(&source_directory)?
.into_iter()
.flatten()
.filter(|f| f.file_type().unwrap().is_file())
.map(|f| f.path())
.filter(|f| pattern.matches(&f.file_name().unwrap_or_default().to_string_lossy()))
.collect();
files.sort();
let results: Result<Vec<_>, _> = files.iter()
.step_by(nth as usize)
.map(PathBuf::from)
.map(move |f| mover.copy(f.as_path(), destination_directory.as_path()))
.collect();
results?;
Ok(())
}