#[derive(Debug)]
pub struct ReloadableResolver<Loader> {
reloadable: rustls_cert_reloadable::Reloadable<rustls::sign::CertifiedKey, Loader>,
}
impl<Loader> ReloadableResolver<Loader>
where
Loader: rustls_cert_reloadable::Loader<Value = rustls::sign::CertifiedKey>,
{
pub async fn init(loader: Loader) -> Result<Self, Loader::Error> {
let (reloadable, _) = rustls_cert_reloadable::Reloadable::init_load(loader).await?;
Ok(Self { reloadable })
}
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
}
}