1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//! Reloading-related utilities.

/// Reloadable server certificate resolver.
#[derive(Debug)]
pub struct ReloadableResolver<Loader> {
    /// The inner reloadable value.
    reloadable: rustls_cert_reloadable::Reloadable<rustls::sign::CertifiedKey, Loader>,
}

impl<Loader> ReloadableResolver<Loader>
where
    Loader: rustls_cert_reloadable::Loader<Value = rustls::sign::CertifiedKey>,
{
    /// Perform the initial load and construct the [`ReloadableResolver`].
    pub async fn init(loader: Loader) -> Result<Self, Loader::Error> {
        let (reloadable, _) = rustls_cert_reloadable::Reloadable::init_load(loader).await?;
        Ok(Self { reloadable })
    }

    /// Perform the reload.
    pub async fn reload(&self) -> Result<(), Loader::Error> {
        let _ = self.reloadable.reload().await?;
        Ok(())
    }
}

impl<Loader> rustls::server::ResolvesServerCert for ReloadableResolver<Loader>
where
    Loader: rustls_cert_reloadable::Loader<Value = rustls::sign::CertifiedKey>,
    Loader: Send + std::fmt::Debug,
{
    fn resolve(
        &self,
        _client_hello: rustls::server::ClientHello,
    ) -> Option<std::sync::Arc<rustls::sign::CertifiedKey>> {
        Some(self.reloadable.get())
    }
}

impl<Loader> std::ops::Deref for ReloadableResolver<Loader> {
    type Target = rustls_cert_reloadable::Reloadable<rustls::sign::CertifiedKey, Loader>;

    fn deref(&self) -> &Self::Target {
        &self.reloadable
    }
}

impl<Loader> std::ops::DerefMut for ReloadableResolver<Loader> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.reloadable
    }
}