1use std::net::{IpAddr, Ipv4Addr};
2
3pub trait Randomize {
4 fn random() -> Self
5 where
6 Self: Sized;
7
8 fn rand_list0(range: u32) -> Vec<Self>
9 where
10 Self: Sized,
11 {
12 (0..=rand_num_from(1..=range))
13 .map(|_| Self::random())
14 .collect::<Vec<Self>>()
15 }
16
17 fn rand_list1(range: u32) -> Vec<Self>
18 where
19 Self: Sized,
20 {
21 (1..=rand_num_from(1..=range))
22 .map(|_| Self::random())
23 .collect::<Vec<Self>>()
24 }
25
26 fn list(size: u16) -> Vec<Self>
27 where
28 Self: Sized,
29 {
30 (1..=size).map(|_| Self::random()).collect::<Vec<Self>>()
31 }
32}
33
34pub fn opt<T: Clone>(t: T) -> Option<T> {
35 sample(&[Some(t), None])
36}
37
38impl crate::Randomize for bool {
39 fn random() -> Self {
40 use rand::Rng;
41
42 let mut rng = rand::thread_rng();
43
44 rng.gen_range(0..1000) > 500
45 }
46}
47
48pub fn sample<T: Clone, const N: usize>(array: &[T; N]) -> T {
49 use rand::Rng;
50
51 let mut rng = rand::thread_rng();
52
53 array[rng.gen_range(0..array.len())].clone()
54}
55
56pub fn sample_vec<T: Clone>(vector: &[T]) -> T {
57 use rand::Rng;
58
59 let mut rng = rand::thread_rng();
60
61 vector.get(rng.gen_range(0..vector.len())).cloned().unwrap()
62}
63
64pub fn rand_str_of(size: usize) -> String {
65 use rand::{distributions::Alphanumeric, Rng};
66
67 rand::thread_rng()
68 .sample_iter(&Alphanumeric)
69 .take(size)
70 .map(char::from)
71 .collect()
72}
73
74impl Randomize for String {
75 fn random() -> Self {
76 use rand::{distributions::Alphanumeric, Rng};
77
78 rand::thread_rng()
79 .sample_iter(&Alphanumeric)
80 .take(10)
81 .map(char::from)
82 .collect()
83 }
84}
85
86pub fn rand_num_from<T, R>(range: R) -> T
87where
88 T: rand::distributions::uniform::SampleUniform,
89 R: rand::distributions::uniform::SampleRange<T>,
90{
91 use rand::Rng;
92
93 let mut rng = rand::thread_rng();
94
95 rng.gen_range(range)
96}
97
98impl Randomize for IpAddr {
99 fn random() -> Self {
100 IpAddr::V4(Randomize::random())
101 }
102}
103
104impl Randomize for Ipv4Addr {
105 fn random() -> Self {
106 let ip_part = || rand_num_from(1..255);
107
108 Ipv4Addr::new(ip_part(), ip_part(), ip_part(), ip_part())
109 }
110}