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}