Documentation
use rand::{RngCore, thread_rng};

pub fn uuid4() -> String {
    let random_bytes = get_random_bytes();
    let mut hex_string = String::new();

    for (i, byte) in random_bytes.iter().enumerate() {
        if [4, 6, 8, 10].contains(&i) {
            hex_string.push_str("-");
        }

        hex_string.push_str(&format!("{:02x}", byte));
    }

    hex_string
}

fn get_random_bytes() -> [u8; 16] {
    let mut rng = thread_rng();
    let mut bytes = [0_u8; 16];
    rng.fill_bytes(&mut bytes);

    bytes
}