use crate::error::{CriticalError, NodeHandleJoinError};
pub struct Handle {
relayer: Option<essential_relayer::Handle>,
validation: Option<crate::handles::validation::Handle<CriticalError>>,
}
impl Handle {
pub(crate) fn new(
relayer: Option<essential_relayer::Handle>,
validation: Option<crate::handles::validation::Handle<CriticalError>>,
) -> Self {
Self {
relayer,
validation,
}
}
pub async fn close(self) -> Result<(), CriticalError> {
let Self {
relayer,
validation,
} = self;
if let Some(relayer) = relayer {
relayer.close().await?;
}
if let Some(validation) = validation {
validation.close().await?;
}
Ok(())
}
pub async fn join(self) -> Result<(), NodeHandleJoinError> {
let Self {
relayer,
validation,
} = self;
let relayer_future = async move {
if let Some(relayer) = relayer {
relayer.join().await.map_err(NodeHandleJoinError::Relayer)
} else {
Ok(())
}
};
tokio::pin!(relayer_future);
let validation_future = async move {
if let Some(validation) = validation {
validation
.join()
.await
.map_err(NodeHandleJoinError::Validation)
} else {
Ok(())
}
};
tokio::pin!(validation_future);
tokio::try_join!(relayer_future, validation_future)?;
Ok(())
}
}