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}