use super::*;
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SummarizeMode {
Compact,
FromHere,
UpToHere,
}
impl SummarizeMode {
#[must_use]
pub fn slug(self) -> &'static str {
match self {
SummarizeMode::Compact => "compact",
SummarizeMode::FromHere => "summarize-from-here",
SummarizeMode::UpToHere => "summarize-up-to-here",
}
}
#[must_use]
pub fn direction(self) -> Option<&'static str> {
match self {
SummarizeMode::Compact => None,
SummarizeMode::FromHere => Some("from"),
SummarizeMode::UpToHere => Some("up_to"),
}
}
#[must_use]
pub fn from_direction(d: &str) -> Option<Self> {
match d {
"from" => Some(SummarizeMode::FromHere),
"up_to" => Some(SummarizeMode::UpToHere),
_ => None,
}
}
}
impl Record {
#[must_use]
pub fn summarize_direction(&self) -> Option<&str> {
self.summarize_metadata.as_ref()?.get("direction")?.as_str()
}
#[must_use]
pub fn summary_compaction_mode(&self) -> Option<SummarizeMode> {
if !self.is_compact_summary.unwrap_or(false) {
return None;
}
match self.summarize_direction() {
None => Some(SummarizeMode::Compact),
Some(d) => SummarizeMode::from_direction(d),
}
}
}
#[derive(Debug, Default)]
pub struct SummarizeIndex {
by_boundary_uuid: HashMap<String, SummarizeMode>,
}
impl SummarizeIndex {
#[allow(dead_code)]
pub fn from_records<'a>(records: impl IntoIterator<Item = &'a Record>) -> Self {
Self::from_nodes(records.into_iter().map(ChainNode::Full))
}
pub fn from_nodes<'a>(records: impl IntoIterator<Item = ChainNode<'a>>) -> Self {
let mut by_boundary_uuid = HashMap::new();
let mut pending: Option<&str> = None;
for rec in records {
if rec.subtype().is_some() && rec.is_compact_boundary() {
pending = rec.uuid();
continue;
}
if let Some(mode) = rec.summary_compaction_mode() {
if let Some(uuid) = pending.take() {
by_boundary_uuid.insert(uuid.to_string(), mode);
}
}
}
SummarizeIndex { by_boundary_uuid }
}
#[must_use]
pub fn mode_for_boundary(&self, uuid: Option<&str>) -> Option<SummarizeMode> {
self.by_boundary_uuid.get(uuid?).copied()
}
}