rustls_cert_reloadable_resolver/
resolver.rs

1//! Reloading-related utilities.
2
3/// Reloadable server certificate resolver.
4#[derive(Debug)]
5pub struct ReloadableResolver<Loader> {
6    /// The inner reloadable value.
7    reloadable: reloadable_state::Reloadable<rustls::sign::CertifiedKey, Loader>,
8}
9
10impl<Loader> ReloadableResolver<Loader>
11where
12    Loader: reloadable_state::core::Loader<Value = rustls::sign::CertifiedKey>,
13{
14    /// Perform the initial load and construct the [`ReloadableResolver`].
15    pub async fn init(loader: Loader) -> Result<Self, Loader::Error> {
16        let (reloadable, _) = reloadable_state::Reloadable::init_load(loader).await?;
17        Ok(Self { reloadable })
18    }
19
20    /// Perform the reload.
21    pub async fn reload(&self) -> Result<(), Loader::Error> {
22        let _ = self.reloadable.reload().await?;
23        Ok(())
24    }
25}
26
27impl<Loader> rustls::server::ResolvesServerCert for ReloadableResolver<Loader>
28where
29    Loader: reloadable_state::core::Loader<Value = rustls::sign::CertifiedKey>,
30    Loader: Send,
31    Loader: std::fmt::Debug,
32{
33    fn resolve(
34        &self,
35        _client_hello: rustls::server::ClientHello,
36    ) -> Option<std::sync::Arc<rustls::sign::CertifiedKey>> {
37        Some(self.reloadable.get())
38    }
39}
40
41impl<Loader> std::ops::Deref for ReloadableResolver<Loader> {
42    type Target = reloadable_state::Reloadable<rustls::sign::CertifiedKey, Loader>;
43
44    fn deref(&self) -> &Self::Target {
45        &self.reloadable
46    }
47}
48
49impl<Loader> std::ops::DerefMut for ReloadableResolver<Loader> {
50    fn deref_mut(&mut self) -> &mut Self::Target {
51        &mut self.reloadable
52    }
53}