sbrd_gen/generator/random_children/
random_child_generator.rs

1use crate::builder::GeneratorBuilder;
2use crate::error::{BuildError, GenerateError};
3use crate::generator::{GeneratorBase, Randomizer, WeightedChild, WeightedChildGeneratorBase};
4use crate::value::{DataValue, DataValueMap};
5use crate::GeneratorType;
6
7/// The generator with picked out the value from the input values or the value generated by picked out child generator
8pub struct RandomChildGenerator<R: Randomizer + ?Sized> {
9    nullable: bool,
10    selectable_values: Vec<WeightedChild<R>>,
11}
12
13impl<R: Randomizer + ?Sized> WeightedChildGeneratorBase<R> for RandomChildGenerator<R> {
14    fn get_selectable(&self) -> &[WeightedChild<R>] {
15        &self.selectable_values
16    }
17}
18
19impl<R: Randomizer + ?Sized> GeneratorBase<R> for RandomChildGenerator<R> {
20    fn create(builder: GeneratorBuilder) -> Result<Self, BuildError>
21    where
22        Self: Sized,
23    {
24        let GeneratorBuilder {
25            generator_type,
26            nullable,
27            children,
28            ..
29        } = builder;
30
31        if generator_type != GeneratorType::RandomChild {
32            return Err(BuildError::InvalidType(generator_type));
33        }
34
35        let selectable_values = Self::build_selectable(children)?;
36
37        Ok(Self {
38            nullable,
39            selectable_values,
40        })
41    }
42
43    fn is_nullable(&self) -> bool {
44        self.nullable
45    }
46
47    fn generate_without_null(
48        &self,
49        rng: &mut R,
50        context: &DataValueMap<&str>,
51    ) -> Result<DataValue, GenerateError> {
52        self.generate_from_children(rng, context)
53    }
54}