cbg_core/
fun.rs

1//! fun stuff (or misc i just didn't know where to put them)
2//! currently houses pi and ipv4 randomizer
3use core::f64::consts::PI;
4use rand::Rng;
5
6pub fn pi(rng: &mut impl Rng) -> String {
7    let mut pi_string = format!("{:.15}", core::f64::consts::PI); // get Pi to 15 decimal places
8
9    // VERY SMALL CHANCE to mess up a digit
10    if rng.random_bool(PI.fract()) {
11        let digits: Vec<char> = pi_string.chars().collect();
12
13        // pick a random index after the decimal point (skip '3' and '.')
14        let idx = rng.random_range(2..digits.len());
15        let new_digit = rng.random_range(0..10).to_string().chars().next().unwrap();
16
17        let mut new_pi_string = digits.clone();
18        new_pi_string[idx] = new_digit;
19        pi_string = new_pi_string.iter().collect();
20    }
21
22    pi_string
23}
24
25pub fn get_random_ipv4(rng: &mut impl Rng) -> String {
26    let octet1: u8 = rng.random_range(0..=255);
27    let octet2: u8 = rng.random_range(0..=255);
28    let octet3: u8 = rng.random_range(0..=255);
29    let octet4: u8 = rng.random_range(0..=255);
30
31    format!("{}.{}.{}.{}", octet1, octet2, octet3, octet4)
32}
33
34#[cfg(test)]
35mod test {
36    use rand::{SeedableRng, rngs::StdRng};
37
38    use super::*;
39
40    #[test]
41    fn test_pi() {
42        let seed: u64 = 12345;
43        let mut rng = StdRng::seed_from_u64(seed);
44        let pi = pi(&mut rng)
45            .parse::<f64>()
46            .expect("HEY!! pi() returned non f64 value!");
47        assert_eq!(pi, PI);
48    }
49
50    // #[test]
51    // fn is_random_ipv4_vaild() {
52    // let mut rng = StdRng::from_os_rng();
53    // let ip = get_random_ipv4(&mut rng);
54    // }
55}