use crate::{callbacks::*, config::Config, connection::Connection, error::Error};
use core::task::Poll;
use pin_project_lite::pin_project;
use std::{future::Future, pin::Pin};
pub trait ClientHelloCallback: 'static + Send + Sync {
fn on_client_hello(
&self,
connection: &mut Connection,
) -> ConnectionFutureResult;
}
pin_project! {
pub struct ConfigResolver<F: Future<Output = Result<Config, Error>>> {
#[pin]
fut: F,
}
}
impl<F: 'static + Send + Future<Output = Result<Config, Error>>> ConfigResolver<F> {
pub fn new(fut: F) -> Self {
ConfigResolver { fut }
}
}
impl<F: 'static + Send + Sync + Future<Output = Result<Config, Error>>> ConnectionFuture
for ConfigResolver<F>
{
fn poll(
self: Pin<&mut Self>,
connection: &mut Connection,
ctx: &mut core::task::Context,
) -> Poll<Result<(), Error>> {
let this = self.project();
let config = match this.fut.poll(ctx) {
Poll::Ready(config) => config?,
Poll::Pending => return Poll::Pending,
};
connection.set_config(config)?;
Poll::Ready(Ok(()))
}
}