use anyhow::{anyhow, Result};
use std::time::{SystemTime, UNIX_EPOCH};
pub trait TimeProvider {
fn now(&self) -> SystemTime;
}
pub struct SystemTimeProvider;
impl TimeProvider for SystemTimeProvider {
fn now(&self) -> SystemTime {
SystemTime::now()
}
}
pub trait ElapsedMinutes {
fn elapsed_minutes(&self) -> u64;
}
impl ElapsedMinutes for SystemTime {
fn elapsed_minutes(&self) -> u64 {
self.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs() / 60)
.unwrap_or(0)
}
}
pub fn generate_random_bytes(len: usize) -> Result<Vec<u8>> {
let mut buf = vec![0u8; len];
getrandom::fill(&mut buf).map_err(|e| anyhow!("failed to get random bytes: {}", e))?;
Ok(buf)
}