Documentation
use std::sync::Arc;

use rustls::crypto::CryptoProvider;

pub(crate) fn crypto_provider() -> Arc<CryptoProvider> {
    #[cfg(any(feature = "aws-lc-rs", feature = "ring"))]
    {
        CryptoProvider::get_default().cloned().unwrap_or_else(|| {
            #[cfg(feature = "aws-lc-rs")]
            let provider = rustls::crypto::aws_lc_rs::default_provider();
            #[cfg(all(not(feature = "aws-lc-rs"), feature = "ring"))]
            let provider = rustls::crypto::ring::default_provider();

            Arc::new(provider)
        })
    }

    #[cfg(not(any(feature = "aws-lc-rs", feature = "ring")))]
    {
        CryptoProvider::get_default()
            .cloned()
            .expect("No rustls crypto provider configured. When using the `rustls-no-provider` feature, a crypto provider must be installed before using lettre. For example:\n\n    use rustls::crypto::CryptoProvider;\n    CryptoProvider::install_default(your_provider).expect(\"Failed to install crypto provider\");\n")
    }
}