sbrd_gen/generator/primitive/
real_generator.rs

1use crate::builder::{GeneratorBuilder, ValueBound};
2use crate::error::{BuildError, GenerateError};
3use crate::generator::{GeneratorBase, Randomizer};
4use crate::value::{DataValue, DataValueMap, SbrdReal};
5use crate::GeneratorType;
6
7/// The generator with generate [`DataValue::Real`] value with range of generated value.
8///
9/// [`DataValue::Real`]: ../../value/enum.DataValue.html#variant.Real
10#[derive(Debug, PartialEq, Clone)]
11pub struct RealGenerator {
12    nullable: bool,
13    range: ValueBound<SbrdReal>,
14}
15
16impl<R: Randomizer + ?Sized> GeneratorBase<R> for RealGenerator {
17    fn create(builder: GeneratorBuilder) -> Result<Self, BuildError>
18    where
19        Self: Sized,
20    {
21        let GeneratorBuilder {
22            generator_type,
23            nullable,
24            range,
25            ..
26        } = builder;
27
28        if generator_type != GeneratorType::Real {
29            return Err(BuildError::InvalidType(generator_type));
30        }
31
32        let default_range = Self::default_range();
33        let _range = match range {
34            None => default_range,
35            Some(r) => r
36                .try_convert_with(|s| {
37                    s.to_parse_string().parse::<SbrdReal>().map_err(|e| {
38                        BuildError::FailParseValue(
39                            s.to_parse_string(),
40                            "Real".to_string(),
41                            e.to_string(),
42                        )
43                    })
44                })
45                .map(|range| {
46                    // 範囲指定がないと[0, 1)で生成されてしまうため上限下限を設定する
47                    range.without_no_bound_from_other(default_range)
48                })?,
49        };
50        if _range.is_empty() {
51            return Err(BuildError::RangeEmpty(_range.convert_into()));
52        }
53
54        Ok(Self {
55            nullable,
56            range: _range,
57        })
58    }
59
60    fn is_nullable(&self) -> bool {
61        self.nullable
62    }
63
64    fn generate_without_null(
65        &self,
66        rng: &mut R,
67        _context: &DataValueMap<&str>,
68    ) -> Result<DataValue, GenerateError> {
69        let real = rng.gen_range(self.range);
70
71        Ok(DataValue::Real(real))
72    }
73}
74
75impl RealGenerator {
76    fn default_range() -> ValueBound<SbrdReal> {
77        ValueBound::new(
78            Some(i16::MIN as SbrdReal),
79            Some((true, i16::MAX as SbrdReal)),
80        )
81    }
82}