use crate::codec::{ConflictRec, Val};
pub(super) struct Host<'a> {
pub(super) prefix: String,
pub(super) conflicts: &'a mut Vec<ConflictRec>,
}
impl<'a> Host<'a> {
pub(super) const fn root(conflicts: &'a mut Vec<ConflictRec>) -> Self {
Host {
prefix: String::new(),
conflicts,
}
}
pub(super) fn path(&self, name: &str) -> String {
format!("{}{name}", self.prefix)
}
pub(super) fn nest(&mut self, name: &str) -> Host<'_> {
Host {
prefix: format!("{}{name}.", self.prefix),
conflicts: self.conflicts,
}
}
pub(super) fn conflict(&mut self, name: &str, sides: [Option<&Val>; 3]) {
let path = self.path(name);
self.conflicts.push(conflict(&path, sides));
}
}
pub(super) fn conflict(path: &str, sides: [Option<&Val>; 3]) -> ConflictRec {
ConflictRec::new(path, sides.map(|side| super::same::present(side).cloned()))
}