1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/// 运算代送
pub mod iter;
/// 随机集合
pub mod random;
cfg_base64! {
  /// base64
  pub mod base64;
}
cfg_uuid! {
  pub use uuid;
}

/// # Random 工具宏
///
/// # Exmaple `Nanoid`
/// ```no_run
/// fn main() {
///     use e_utils::algorithm;
///     println!("nanoid -> {}", algorithm!(nanoid));
///     println!("nanoid 16bytes -> {}", algorithm!(nanoid 16));
///     println!("nanoid 16bytes -> {}", algorithm!(nanoid 16));
///     println!("nanoid 10bytes [alphabet:expr] -> {}", algorithm!(nanoid 16, &['1', 'b', 'c', '7']));
///     println!("nanoid unsafe 10bytes -> {}", algorithm!(nanoid unsafe 10));
///     println!("nanoid unsafe 10bytes [alphabet:expr]-> {}", algorithm!(nanoid unsafe 10, &['1','0']));
/// }
/// ```
///
/// # Exmaple `random`
/// ```no_run
/// fn main() {
///    use e_utils::algorithm;
///    println!("random bool -> {}", algorithm!());
///    println!("random type -> {}", algorithm!(#u32));
///    println!("random type[] -> {:?}", algorithm!([u32; 10]));
///    println!("random range 0-13 -> {}", algorithm!(13));
///    println!("random range -> {}", algorithm!(0i32..13));
///    println!("random rgb range -> {:?}", algorithm!(rgb 100,255));
/// }
/// ```
#[macro_export]
#[cfg(feature = "algorithm")]
#[doc(hidden)]
macro_rules! algorithm {
  () => {
    $crate::algorithm::random::Rand::Safe.random_bool()
  };
  (#$t:ty) => {
    $crate::algorithm::random::Rand::Safe.random_type::<$t>()
  };
  ([$t:ty; $size:expr]) => {
    $crate::algorithm::random::Rand::Safe.random_type::<[$t; $size]>()
  };
  (rgb $min:tt, $max:tt) => {
    $crate::algorithm::random::Rand::Safe.rgb_range($min, $max)
  };
  (nanoid) => {
    $crate::algorithm::random::Rand::Safe.nanoid_format(&$crate::algorithm::random::NID_SAFE, 21)
  };
  // generate
  (nanoid $size:tt) => {
    $crate::algorithm::random::Rand::Safe.nanoid_format(&$crate::algorithm::random::NID_SAFE, $size)
  };
  // custom
  (nanoid $size:tt, $alphabet:expr) => {
    $crate::algorithm::random::Rand::Safe.nanoid_format($alphabet, $size)
  };
  // unsafe
  (nanoid unsafe $size:tt) => {
    $crate::algorithm::random::Rand::UnSafe
      .nanoid_format(&$crate::algorithm::random::NID_SAFE, $size)
  };
  // unsafe custom
  (nanoid unsafe $size:tt, $alphabet:expr) => {
    $crate::algorithm::random::Rand::UnSafe.nanoid_format($alphabet, $size)
  };
  // UUID 获取
  (uuid_v4 $size:tt, $alphabet:expr) => {
    $crate::algorithm::random::Rand::UnSafe.nanoid_format($alphabet, $size)
  };
  ($size:tt) => {
    $crate::algorithm::random::Rand::Safe.random_range(0..$size)
  };
  ($min:tt..$max:tt) => {
    $crate::algorithm::random::Rand::Safe.random_range($min..$max)
  };
}