use crate::RonlogReferences;
use std::collections::HashMap;
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct Fragment {
references: RonlogReferences,
changes: HashMap<String, Vec<String>>,
}
impl Fragment {
crate::getters!(@fn @ref
references: RonlogReferences,
changes: HashMap<String, Vec<String>>
);
pub fn merge(&mut self, other: Self) {
for (link, target) in other.references {
self
.references
.entry(link)
.and_modify(|t| *t = target.clone())
.or_insert(target);
}
for (category, changes) in other.changes {
self.changes.entry(category.clone()).or_default();
let mut change_list = self.changes[&category].clone();
change_list.append(&mut changes.clone());
self.changes.insert(category, change_list);
}
}
#[must_use]
pub fn move_references(&mut self) -> RonlogReferences {
let result = self.references.clone();
self.references.clear();
result
}
#[must_use]
pub fn new(
references: &RonlogReferences,
changes: &HashMap<String, Vec<String>>,
) -> Self {
Self {
references: references.clone(),
changes: changes.clone(),
}
}
}
impl Default for Fragment {
fn default() -> Self {
Self::new(&RonlogReferences::new(), &HashMap::new())
}
}