use rustc_hash::FxHashSet;
use crate::{arena::ElementId, innerlude::BorrowedAttributeValue, ScopeId, Template};
#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
#[derive(Debug, Default)]
#[must_use = "not handling edits can lead to visual inconsistencies in UI"]
pub struct Mutations<'a> {
pub subtree: usize,
pub dirty_scopes: FxHashSet<ScopeId>,
pub templates: Vec<Template<'a>>,
pub edits: Vec<Mutation<'a>>,
}
impl<'a> Mutations<'a> {
pub fn santize(mut self) -> Self {
for edit in self.edits.iter_mut() {
if let Mutation::LoadTemplate { name, .. } = edit {
*name = "template"
}
}
self
}
pub(crate) fn push(&mut self, mutation: Mutation<'static>) {
self.edits.push(mutation)
}
}
#[cfg_attr(
feature = "serialize",
derive(serde::Serialize, serde::Deserialize),
serde(tag = "type")
)]
#[derive(Debug, PartialEq)]
pub enum Mutation<'a> {
AppendChildren {
id: ElementId,
m: usize,
},
AssignId {
path: &'static [u8],
id: ElementId,
},
CreatePlaceholder {
id: ElementId,
},
CreateTextNode {
value: &'a str,
id: ElementId,
},
HydrateText {
path: &'static [u8],
value: &'a str,
id: ElementId,
},
LoadTemplate {
name: &'static str,
index: usize,
id: ElementId,
},
ReplaceWith {
id: ElementId,
m: usize,
},
ReplacePlaceholder {
path: &'static [u8],
m: usize,
},
InsertAfter {
id: ElementId,
m: usize,
},
InsertBefore {
id: ElementId,
m: usize,
},
SetAttribute {
name: &'a str,
value: BorrowedAttributeValue<'a>,
id: ElementId,
ns: Option<&'a str>,
},
SetText {
value: &'a str,
id: ElementId,
},
NewEventListener {
name: &'a str,
id: ElementId,
},
RemoveEventListener {
name: &'a str,
id: ElementId,
},
Remove {
id: ElementId,
},
PushRoot {
id: ElementId,
},
}