use rand::{distr::Alphanumeric, Rng};
use crate::traits::IdProvider;
use jsonrpsee_types::SubscriptionId;
#[derive(Debug, Copy, Clone)]
pub struct RandomIntegerIdProvider;
impl IdProvider for RandomIntegerIdProvider {
fn next_id(&self) -> SubscriptionId<'static> {
const JS_NUM_MASK: u64 = !0 >> 11;
(rand::random::<u64>() & JS_NUM_MASK).into()
}
}
#[derive(Debug, Copy, Clone)]
pub struct RandomStringIdProvider {
len: usize,
}
impl RandomStringIdProvider {
pub fn new(len: usize) -> Self {
Self { len }
}
}
impl IdProvider for RandomStringIdProvider {
fn next_id(&self) -> SubscriptionId<'static> {
let mut rng = rand::rng();
(&mut rng).sample_iter(Alphanumeric).take(self.len).map(char::from).collect::<String>().into()
}
}
#[derive(Debug, Copy, Clone)]
pub struct NoopIdProvider;
impl IdProvider for NoopIdProvider {
fn next_id(&self) -> SubscriptionId<'static> {
0.into()
}
}