datagen_rs/schema/
integer.rs

1use crate::schema::transform::Transform;
2#[cfg(feature = "schema")]
3use schemars::JsonSchema;
4#[cfg(feature = "serialize")]
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone)]
8#[cfg_attr(feature = "schema", derive(JsonSchema))]
9#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
10#[cfg_attr(feature = "serialize", serde(untagged, deny_unknown_fields))]
11pub enum Integer {
12    Random {
13        #[cfg_attr(feature = "serialize", serde(skip_serializing_if = "Option::is_none"))]
14        min: Option<i64>,
15        #[cfg_attr(feature = "serialize", serde(skip_serializing_if = "Option::is_none"))]
16        max: Option<i64>,
17        transform: Option<Vec<Transform>>,
18    },
19    Constant {
20        value: i64,
21        transform: Option<Vec<Transform>>,
22    },
23}
24
25#[cfg(feature = "generate")]
26pub mod generate {
27    use crate::generate::current_schema::CurrentSchemaRef;
28    use crate::generate::generated_schema::generate::IntoGenerated;
29    use crate::generate::generated_schema::GeneratedSchema;
30    use crate::schema::integer::Integer;
31    use crate::schema::transform::Transform;
32    use crate::util::types::Result;
33    use rand::Rng;
34
35    impl IntoGenerated for Integer {
36        fn into_generated(self, _: CurrentSchemaRef) -> Result<GeneratedSchema> {
37            Ok(match self {
38                Integer::Constant { value, .. } => GeneratedSchema::Integer(value),
39                Integer::Random { min, max, .. } => {
40                    let mut rng = rand::thread_rng();
41                    let min = min.unwrap_or(i64::MIN);
42                    let max = max.unwrap_or(i64::MAX);
43                    let value = rng.gen_range(min..=max);
44                    GeneratedSchema::Integer(value)
45                }
46            })
47        }
48
49        fn get_transform(&self) -> Option<Vec<Transform>> {
50            match self {
51                Integer::Constant { transform, .. } => transform.clone(),
52                Integer::Random { transform, .. } => transform.clone(),
53            }
54        }
55    }
56}