sbrd_gen/generator/primitive/
real_generator.rs1use 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#[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 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}