use std::fmt::Write;
use crate::ctx::GenContext;
use crate::field::Ordering;
use super::helpers::charsets::primitive_len;
use super::helpers::handle::unique_tag;
use super::helpers::monotonic::monotonic_value;
pub fn gen(ctx: &mut GenContext<'_>, buf: &mut String) {
let width = primitive_len(ctx.modifier, &mut ctx.rng);
if ctx.range.is_some() || matches!(ctx.ordering, Ordering::Asc | Ordering::Desc) {
let max_for_width = 10_i64.saturating_pow(width as u32) - 1;
let (min, max) = ctx.range.unwrap_or((0, max_for_width));
let value = if matches!(ctx.ordering, Ordering::Asc | Ordering::Desc) {
let tag = unique_tag(ctx.rng.record(), 0xD161);
monotonic_value(ctx.rng.record(), tag, min, max, ctx.ordering)
} else {
ctx.rng.range(min, max)
};
let _ = write!(buf, "{value:0>width$}");
} else {
ctx.rng.push_digits(buf, width);
}
}