chinese_rand/
digit_sequences.rs

1use crate::ChineseFormatGenerator;
2use chinese_format::{Decimal, IntegerPart};
3use digit_sequence::DigitSequence;
4use std::{iter::repeat_with, ops::RangeInclusive};
5
6impl ChineseFormatGenerator {
7    /// Generates a random [DigitSequence] with length in the given range.
8    ///
9    /// ```
10    /// use chinese_rand::*;
11    /// use digit_sequence::DigitSequence;
12    ///
13    /// fastrand::seed(90);
14    /// let raw_generator = FastRandGenerator::new();
15    /// let generator = ChineseFormatGenerator::new(raw_generator);
16    ///
17    /// let sequence = generator.digit_sequence(0..=10);
18    /// assert_eq!(sequence, DigitSequence::from(3724260u32));
19    ///
20    /// let fixed_length = generator.digit_sequence(5..=5);
21    /// assert_eq!(fixed_length, DigitSequence::from(85241u32));
22    ///
23    /// let empty = generator.digit_sequence(0..=0);
24    /// assert_eq!(empty, DigitSequence::new());
25    /// ```
26    ///
27    /// **Required feature**: `digit-sequence`.
28    pub fn digit_sequence(&self, length_range: RangeInclusive<u8>) -> DigitSequence {
29        let length = self.raw_generator.u8(length_range);
30
31        let digits: Vec<u8> = repeat_with(|| self.raw_generator.u8(0..=9))
32            .take(length as usize)
33            .collect();
34
35        digits.try_into().expect("Digits valid by construction")
36    }
37
38    /// Generates a random [Decimal].
39    ///
40    /// ```
41    /// use chinese_rand::*;
42    /// use chinese_format::Decimal;
43    /// use digit_sequence::DigitSequence;
44    ///
45    /// fastrand::seed(90);
46    /// let raw_generator = FastRandGenerator::new();
47    /// let generator = ChineseFormatGenerator::new(raw_generator);
48    ///
49    /// let decimal = generator.decimal(
50    ///     i128::MIN..=i128::MAX,
51    ///     0..=4
52    /// );
53    /// assert_eq!(decimal, Decimal {
54    ///     integer: -139744823884027955216713073977120108615,
55    ///     fractional: 242u8.into()
56    /// });
57    ///
58    /// let fixed = generator.decimal(90..=90, 5..=5);
59    /// assert_eq!(fixed, Decimal {
60    ///     integer: 90,
61    ///     fractional: 85241u32.into()
62    /// });
63    ///
64    /// let zero = generator.decimal(0..=0, 0..=0);
65    /// assert_eq!(zero, Decimal {
66    ///     integer: 0,
67    ///     fractional: DigitSequence::new()
68    /// });
69    /// ```
70    ///
71    /// **Required feature**: `digit-sequence`.
72    pub fn decimal(
73        &self,
74        integer_range: RangeInclusive<IntegerPart>,
75        fractional_length_range: RangeInclusive<u8>,
76    ) -> Decimal {
77        let integer: IntegerPart = self.raw_generator.i128(integer_range);
78
79        let fractional: DigitSequence = self.digit_sequence(fractional_length_range);
80
81        Decimal {
82            integer,
83            fractional,
84        }
85    }
86}