use std::sync::Arc;
use microsandbox_protocol_client::{BoxFuture, BoxTransport, Connector};
use tokio::time::Instant;
use crate::ControlClientResult;
pub trait VerifiedControlConnector: Send + Sync {
fn connect(&self, deadline: Instant) -> BoxFuture<'_, ControlClientResult<BoxTransport>>;
fn verify_session(&self, deadline: Instant) -> BoxFuture<'_, ControlClientResult<()>>;
}
#[derive(Clone)]
pub(crate) enum Dialer {
Unverified(Arc<dyn Connector>),
Verified(Arc<dyn VerifiedControlConnector>),
}
impl Dialer {
pub(crate) fn verified(&self) -> bool {
matches!(self, Self::Verified(_))
}
pub(crate) async fn connect(&self, deadline: Instant) -> ControlClientResult<BoxTransport> {
Ok(match self {
Self::Unverified(connector) => connector.connect(deadline).await?,
Self::Verified(connector) => connector.connect(deadline).await?,
})
}
pub(crate) async fn verify(&self, deadline: Instant) -> ControlClientResult<()> {
match self {
Self::Unverified(_) => Ok(()),
Self::Verified(connector) => connector.verify_session(deadline).await,
}
}
}