use crate::{misc::LeaseMut, rng::CryptoRng};
pub trait CryptoSeedableRng: Sized {
type Seed: Clone + Default + LeaseMut<[u8]>;
#[cfg(feature = "getrandom")]
#[inline]
fn from_getrandom() -> crate::Result<Self> {
let mut seed = Self::Seed::default();
getrandom::fill(seed.lease_mut())?;
Self::from_seed(seed)
}
#[inline]
fn from_crypto_rng<R>(rng: &mut R) -> crate::Result<Self>
where
R: CryptoRng,
{
let mut seed = Self::Seed::default();
rng.fill_slice(seed.lease_mut());
Self::from_seed(seed)
}
#[cfg(all(feature = "nightly", feature = "std"))]
#[inline]
fn from_std_random() -> crate::Result<Self> {
use core::random::RandomSource as _;
let mut seed = Self::Seed::default();
std::random::DefaultRandomSource.fill_bytes(seed.lease_mut());
Self::from_seed(seed)
}
fn from_seed(seed: Self::Seed) -> crate::Result<Self>;
}