vanikam/src/utils/random_number.rs

65 lines
1.7 KiB
Rust

// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
use std::sync::Arc;
use actix_web::web;
use mockall::predicate::*;
use mockall::*;
#[cfg(test)]
#[allow(unused_imports)]
use tests::*;
pub type GenerateRandomNumberInterfaceObj = Arc<dyn GenerateRandomNumberInterface>;
pub type WebGenerateRandomNumberInterfaceObj = web::Data<GenerateRandomNumberInterfaceObj>;
#[automock]
pub trait GenerateRandomNumberInterface: Send + Sync {
fn get_random(&self, num_digits: u32) -> usize;
}
pub struct GenerateRandomNumber;
impl GenerateRandomNumberInterface for GenerateRandomNumber {
fn get_random(&self, num_digits: u32) -> usize {
use rand::{rngs::ThreadRng, thread_rng, Rng};
let mut rng: ThreadRng = thread_rng();
let base: usize = 10;
rng.gen_range(0..base.pow(num_digits) - 1)
}
}
impl GenerateRandomNumber {
pub fn inject() -> impl FnOnce(&mut web::ServiceConfig) {
let g = WebGenerateRandomNumberInterfaceObj::new(Arc::new(GenerateRandomNumber));
let f = move |cfg: &mut web::ServiceConfig| {
cfg.app_data(g);
};
Box::new(f)
}
}
#[cfg(test)]
pub mod tests {
use super::*;
use std::sync::Arc;
pub fn mock_generate_random_number(
times: Option<usize>,
returning: usize,
) -> Arc<dyn GenerateRandomNumberInterface> {
let mut m = MockGenerateRandomNumberInterface::new();
if let Some(times) = times {
m.expect_get_random().times(times).return_const(returning);
} else {
m.expect_get_random().return_const(returning);
}
Arc::new(m)
}
}