ripgen_lib/
manager.rs

1use crate::domain::DomainComponents;
2use crate::error::RipGenError;
3use fxhash::FxHashSet;
4use std::slice::Iter as SliceIter;
5use std::collections::hash_set::Iter as HashSetIter;
6use crate::transform::RipGenTransform;
7
8#[derive(Clone)]
9/// Processes and manages domains and wordlist elements to enable creating [RipGenIterator](crate::RipGenIterator)
10/// via [transformations](Self::transform).
11pub struct RipGenManager<'domains> {
12    domain_components: Vec<DomainComponents<'domains>>,
13    elements: FxHashSet<&'domains str>,
14}
15
16impl<'domain> RipGenManager<'domain> {
17    /// Creates a new `RipGenManager`.
18    ///
19    /// This can fail if any of the `domains` are unable to be parsed.
20    pub fn new(
21        domains: impl Iterator<Item=&'domain str>,
22        words: impl Iterator<Item=&'domain str>,
23        word_filter: &impl Fn(&&str) -> bool
24    ) -> Result<RipGenManager<'domain>, RipGenError>
25    {
26        let domain_components: Vec<DomainComponents> = domains
27            .filter(|line| !line.is_empty())
28            .map(DomainComponents::try_from)
29            .collect::<Result<_, _>>()?;
30
31        let elements: FxHashSet<&'domain str> = crate::words::extract_words(domain_components.iter(), word_filter)
32            .chain(words)
33            .collect();
34
35        let manager = RipGenManager {
36            domain_components,
37            elements
38        };
39
40        Ok(manager)
41    }
42
43    /// Begins a RipGen transform iterator.
44    ///
45    /// Requires a function that can take both a reference to a [DomainComponents](crate::DomainComponents)
46    /// as well as an iterator that produces `&&str`.
47    pub fn transform<'manager, F, O>(&'manager self, transform: F) -> RipGenTransform<'manager, 'domain, F, SliceIter<DomainComponents<'domain>>, HashSetIter<'manager, &'domain str>, O>
48        where
49            F: Fn(&'manager DomainComponents<'domain>, HashSetIter<'manager, &'domain str>) -> O,
50            O: Iterator<Item = String>,
51            'domain: 'manager
52    {
53        RipGenTransform::new(self.domain_components.iter(), self.elements.iter(), transform)
54    }
55}