e_utils/algorithm/
mod.rs

1/// 运算代送
2pub mod iter;
3/// 随机集合
4pub mod random;
5cfg_base64! {
6  /// base64
7  pub mod base64;
8}
9/// Macro for various algorithm operations
10///
11/// This macro supports multiple random operations, including generating random booleans,
12/// random types, random arrays, RGB colors, nanoids, and more.
13///
14/// # Examples
15///
16/// ```
17/// use e_utils::algorithm;
18///
19/// fn main() {
20///     // 生成随机布尔值
21///     let random_bool = algorithm!();
22///     println!("随机布尔值: {}", random_bool);
23///
24///     // 生成随机 u32
25///     let random_u32: u32 = algorithm!(#u32);
26///     println!("随机 u32: {}", random_u32);
27///
28///     // 生成随机数组
29///     let random_array: [u8; 5] = algorithm!([u8; 5]);
30///     println!("随机数组: {:?}", random_array);
31///
32///     // 生成随机 RGB 颜色
33///     let rgb = algorithm!(rgb 0, 255);
34///     println!("随机 RGB: {:?}", rgb);
35///
36///     // 生成默认长度(21)的 nanoid
37///     let default_nanoid = algorithm!(nanoid);
38///     println!("默认 nanoid: {}", default_nanoid);
39///
40///     // 生成自定义长度的 nanoid
41///     let custom_nanoid = algorithm!(nanoid 10);
42///     println!("自定义 nanoid: {}", custom_nanoid);
43///
44///     // 生成指定范围内的随机数
45///     let random_range = algorithm!(0..100);
46///     println!("随机数 (0-99): {}", random_range);
47///
48///     // 生成负数范围内的随机数
49///     let negative_range = algorithm!((-50)..50);
50///     println!("随机数 (-50 到 49): {}", negative_range);
51///
52///     // 生成自定义字母表的 nanoid
53///     let custom_alphabet_nanoid = algorithm!(nanoid 8, &"abcdef123456".chars().collect::<Vec<char>>());
54///     println!("自定义字母表 nanoid: {}", custom_alphabet_nanoid);
55///
56///     // 使用不安全模式生成 nanoid
57///     let unsafe_nanoid = algorithm!(nanoid unsafe 15);
58///     println!("不安全模式 nanoid: {}", unsafe_nanoid);
59///
60///     // 使用不安全模式和自定义字母表生成 nanoid
61///     let unsafe_custom_nanoid = algorithm!(nanoid unsafe 12, &"ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars().collect::<Vec<char>>());
62///     println!("不安全模式自定义字母表 nanoid: {}", unsafe_custom_nanoid);
63/// }
64/// ```
65#[macro_export]
66#[cfg(feature = "algorithm")]
67macro_rules! algorithm {
68  () => {
69    $crate::algorithm::random::Rand::Safe.random_bool()
70  };
71  (#$t:ty) => {
72    $crate::algorithm::random::Rand::Safe.random_type::<$t>()
73  };
74  ([$t:ty; $size:expr]) => {
75    $crate::algorithm::random::Rand::Safe.random_type::<[$t; $size]>()
76  };
77  (rgb $min:tt, $max:tt) => {
78    $crate::algorithm::random::Rand::Safe.rgb_range($min, $max)
79  };
80  (nanoid) => {
81    $crate::algorithm::random::Rand::Safe.nanoid_format(&$crate::algorithm::random::NID_SAFE, 21)
82  };
83  // generate
84  (nanoid $size:tt) => {
85    $crate::algorithm::random::Rand::Safe.nanoid_format(&$crate::algorithm::random::NID_SAFE, $size)
86  };
87  // custom
88  (nanoid $size:tt, $alphabet:expr) => {
89    $crate::algorithm::random::Rand::Safe.nanoid_format($alphabet, $size)
90  };
91  // unsafe
92  (nanoid unsafe $size:tt) => {
93    $crate::algorithm::random::Rand::UnSafe
94      .nanoid_format(&$crate::algorithm::random::NID_SAFE, $size)
95  };
96  // unsafe custom
97  (nanoid unsafe $size:tt, $alphabet:expr) => {
98    $crate::algorithm::random::Rand::UnSafe.nanoid_format($alphabet, $size)
99  };
100  ($size:tt) => {
101    $crate::algorithm::random::Rand::Safe.random_range(0..$size)
102  };
103  ($min:tt..$max:tt) => {
104    $crate::algorithm::random::Rand::Safe.random_range($min..$max)
105  };
106}
107
108#[cfg(test)]
109#[cfg(feature = "algorithm")]
110mod tests {
111    use crate::algorithm;
112
113  #[test]
114  fn test_random_bool() {
115    let _ = algorithm!(); // 确保编译通过
116  }
117
118  #[test]
119  fn test_random_type() {
120    let _: u32 = algorithm!(#u32);
121  }
122
123  #[test]
124  fn test_random_array() {
125    let _: [u8; 5] = algorithm!([u8; 5]);
126  }
127
128  #[test]
129  fn test_rgb_range() {
130    let _ = algorithm!(rgb 0, 255);
131  }
132
133  #[test]
134  fn test_nanoid() {
135    let id = algorithm!(nanoid);
136    assert_eq!(id.len(), 21);
137  }
138
139  #[test]
140  fn test_nanoid_custom_size() {
141    let id = algorithm!(nanoid 10);
142    assert_eq!(id.len(), 10);
143  }
144
145  #[test]
146  fn test_random_range() {
147    let num = algorithm!(0..100);
148    assert!(num >= 0 && num < 100);
149  }
150}