acmer 0.0.18

ACME TLS certificates management library
Documentation
use rustls::{server::WantsServerCert, ConfigBuilder, ServerConfig};

use crate::store::{Certificate, PrivateKey};

pub trait ConfigResolver: Send + Sync {
    fn rustls_config(
        &self,
        sni: &str,
        key: PrivateKey,
        certs: Vec<Certificate>,
    ) -> Result<ServerConfig, rustls::Error>;
}

impl<F> ConfigResolver for F
where
    F: Fn(&str, PrivateKey, Vec<Certificate>) -> Result<ServerConfig, rustls::Error>,
    F: Send + Sync,
{
    fn rustls_config(
        &self,
        sni: &str,
        key: PrivateKey,
        certs: Vec<Certificate>,
    ) -> Result<ServerConfig, rustls::Error> {
        self(sni, key, certs)
    }
}

impl ConfigResolver for ConfigBuilder<ServerConfig, WantsServerCert> {
    fn rustls_config(
        &self,
        _sni: &str,
        key: PrivateKey,
        certs: Vec<Certificate>,
    ) -> Result<ServerConfig, rustls::Error> {
        self.clone().with_single_cert(certs, key)
    }
}