use super::Cryptographer;
use once_cell::sync::OnceCell;
static CRYPTOGRAPHER: OnceCell<&'static dyn Cryptographer> = OnceCell::new();
#[derive(Debug, thiserror::Error)]
#[error("Cryptographer already initialized")]
pub struct SetCryptographerError(());
#[cfg(not(any(feature = "use_ring", feature = "use_openssl")))]
pub fn set_boxed_cryptographer(c: Box<dyn Cryptographer>) -> Result<(), SetCryptographerError> {
set_cryptographer(Box::leak(c))
}
pub fn set_cryptographer(c: &'static dyn Cryptographer) -> Result<(), SetCryptographerError> {
CRYPTOGRAPHER.set(c).map_err(|_| SetCryptographerError(()))
}
pub(crate) fn get_crypographer() -> &'static dyn Cryptographer {
autoinit_crypto();
*CRYPTOGRAPHER
.get()
.expect("`hawk` cryptographer not initialized!")
}
#[cfg(feature = "use_ring")]
#[inline]
fn autoinit_crypto() {
let _ = set_cryptographer(&super::ring::RingCryptographer);
}
#[cfg(feature = "use_openssl")]
#[inline]
fn autoinit_crypto() {
let _ = set_cryptographer(&super::openssl::OpensslCryptographer);
}
#[cfg(not(any(feature = "use_openssl", feature = "use_ring")))]
#[inline]
fn autoinit_crypto() {}