use rand::{Rng, SeedableRng};
const RNG_SEED: u64 = 6148914691236517205;
pub type DeterministicRng = rand::rngs::SmallRng;
pub struct NonDeterministicRng(
#[cfg(target_arch = "wasm32")] std::sync::MutexGuard<'static, DeterministicRng>,
#[cfg(not(target_arch = "wasm32"))] rand::rngs::ThreadRng,
);
impl NonDeterministicRng {
pub fn rng_mut(&mut self) -> &mut impl Rng {
#[cfg(target_arch = "wasm32")]
{
&mut *self.0
}
#[cfg(not(target_arch = "wasm32"))]
{
&mut self.0
}
}
}
pub fn make_deterministic_rng() -> DeterministicRng {
rand::rngs::SmallRng::seed_from_u64(RNG_SEED)
}
pub fn make_nondeterministic_rng() -> NonDeterministicRng {
#[cfg(target_arch = "wasm32")]
{
use std::sync::{Mutex, OnceLock};
use rand::rngs::SmallRng;
static RNG: OnceLock<Mutex<SmallRng>> = OnceLock::new();
NonDeterministicRng(
RNG.get_or_init(|| Mutex::new(make_deterministic_rng()))
.lock()
.expect("failed to lock RNG mutex"),
)
}
#[cfg(not(target_arch = "wasm32"))]
{
NonDeterministicRng(rand::thread_rng())
}
}
pub fn generate_random_alphanumeric_string(length: usize, charset: &[u8]) -> String {
(0..length)
.map(|_| {
let random_index = make_nondeterministic_rng()
.rng_mut()
.gen_range(0..charset.len());
charset[random_index] as char
})
.collect()
}
pub fn generate_test_namespace() -> String {
let charset: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz";
let entry = generate_random_alphanumeric_string(20, charset);
let namespace = format!("table_{}", entry);
tracing::warn!("Generating namespace={}", namespace);
namespace
}