fake/impls/std/
path.rs

1use crate::locales::{Data, EN};
2use crate::{Dummy, Fake, Faker};
3use rand::seq::IndexedRandom;
4use rand::Rng;
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: Rng + ?Sized>(_: &Faker, rng: &mut R) -> Self {
17        DEFAULT_PATH_FAKER.fake_with_rng(rng)
18    }
19}
20
21/// Custom fake path generator given an array of root directories, segments and
22/// extension, and max_level to generate a fake path.
23///
24/// It generates by `root_dirs / max_level * segments . extensions`.
25pub 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: Rng + ?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}