sbrd_gen/generator/random_children/
random_child_generator.rs1use crate::builder::GeneratorBuilder;
2use crate::error::{BuildError, GenerateError};
3use crate::generator::{GeneratorBase, Randomizer, WeightedChild, WeightedChildGeneratorBase};
4use crate::value::{DataValue, DataValueMap};
5use crate::GeneratorType;
6
7pub 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}