1use crate::locales::{Data, EN};
2use crate::{Dummy, Fake, Faker};
3use rand::seq::IndexedRandom;
4use rand::RngExt;
5use std::path::PathBuf;
6
7static DEFAULT_PATH_FAKER: PathFaker = PathFaker {
8 root_dirs: EN::PATH_ROOT_DIRS,
9 segments: EN::PATH_SEGMENTS,
10 extensions: EN::PATH_EXTENSIONS,
11 max_level: 3,
12};
13
14impl Dummy<Faker> for PathBuf {
15 #[inline]
16 fn dummy_with_rng<R: RngExt + ?Sized>(_: &Faker, rng: &mut R) -> Self {
17 DEFAULT_PATH_FAKER.fake_with_rng(rng)
18 }
19}
20
21pub struct PathFaker<'a> {
26 root_dirs: &'a [&'a str],
27 segments: &'a [&'a str],
28 extensions: &'a [&'a str],
29 max_level: usize,
30}
31
32impl<'a> PathFaker<'a> {
33 pub fn new(
34 root_dirs: &'a [&'a str],
35 segments: &'a [&'a str],
36 extensions: &'a [&'a str],
37 max_level: usize,
38 ) -> Self {
39 PathFaker {
40 root_dirs,
41 segments,
42 extensions,
43 max_level,
44 }
45 }
46}
47
48impl<'a> Dummy<PathFaker<'a>> for PathBuf {
49 fn dummy_with_rng<R: RngExt + ?Sized>(c: &PathFaker<'a>, rng: &mut R) -> Self {
50 let root_dir = c.root_dirs.choose(rng).unwrap();
51 let mut path = PathBuf::from(root_dir);
52 for _ in 0..c.max_level {
53 if Faker.fake_with_rng::<bool, _>(rng) {
54 path.push(c.segments.choose(rng).unwrap());
55 }
56 }
57 if let Some(ext) = c.extensions.choose(rng) {
58 path.set_extension(ext);
59 }
60 path
61 }
62}