use spine::Meta;
use crate::Sealed;
use crate::log_error::{LogError, LogResult as Result};
use crate::storage::Storage;
use crate::tree::NaryMerkleLog;
impl<S: Storage> NaryMerkleLog<S> {
pub async fn seal(self) -> Result<Sealed, S::Error> {
self.seal_inner(None).await
}
pub async fn seal_with_meta(self, meta: Meta) -> Result<Sealed, S::Error> {
self.seal_inner(Some(meta)).await
}
async fn seal_inner(self, meta: Option<Meta>) -> Result<Sealed, S::Error> {
let size = self.count();
let k = self.config().arity;
let (frontiers, alg_epochs) = if size == 0 {
(Vec::new(), Vec::new())
} else {
let alg_epochs = self.committed_epochs_at(size);
let mut frontiers = Vec::new();
for &(id, _) in &alg_epochs {
if let Some(true) = crate::committed_active_at(&alg_epochs, id, size) {
let peaks = self.frontier_peaks_at(id, size).await?;
frontiers.push((id, peaks));
}
}
(frontiers, alg_epochs)
};
let sealed =
Sealed::new(size, k, frontiers, alg_epochs).map_err(|_| LogError::MalformedSeal)?;
Ok(match meta {
Some(m) => sealed.with_meta(m),
None => sealed,
})
}
}