seedfaker_core/gen/
integer.rs1use std::fmt::Write;
2
3use crate::ctx::GenContext;
4
5fn tiered_integer(rng: &mut crate::rng::Rng) -> i64 {
16 let w = rng.urange(0, 99);
17 match w {
18 0..=29 => rng.range(1, 100),
19 30..=54 => rng.range(100, 1000),
20 55..=74 => rng.range(1000, 10_000),
21 75..=89 => rng.range(10_000, 100_000),
22 _ => rng.range(100_000, 999_999),
23 }
24}
25
26pub fn raw(ctx: &mut GenContext<'_>) -> f64 {
27 let value =
28 if matches!(ctx.ordering, crate::field::Ordering::Asc | crate::field::Ordering::Desc) {
29 let (min, max) = ctx.range.unwrap_or((1, 999_999));
30 let tag = super::helpers::handle::unique_tag(ctx.rng.record(), 0x1147);
31 super::helpers::monotonic::monotonic_value(
32 ctx.rng.record(),
33 tag,
34 min,
35 max,
36 ctx.ordering,
37 )
38 } else if let Some((min, max)) = ctx.range {
39 if let Some(z) = ctx.zipf {
40 ctx.rng.zipf_range(min, max, z.s)
41 } else {
42 ctx.rng.range(min, max)
43 }
44 } else {
45 tiered_integer(&mut ctx.rng)
46 };
47 value as f64
48}
49
50pub fn fmt(v: f64, _ctx: &mut GenContext<'_>, buf: &mut String) {
51 let _ = write!(buf, "{}", v as i64);
52}
53
54pub fn gen(ctx: &mut GenContext<'_>, buf: &mut String) {
55 let v = raw(ctx);
56 ctx.numeric = Some(v);
57 fmt(v, ctx, buf);
58}