pub use add_attributes::AddAttributes;
pub use append_children::AppendChildren;
pub use change_text::ChangeText;
pub use insert_node::InsertNode;
pub use remove_attributes::RemoveAttributes;
pub use remove_node::RemoveNode;
pub use replace_node::ReplaceNode;
use std::fmt::Debug;
pub use tree_path::TreePath;
mod add_attributes;
mod append_children;
mod change_text;
mod insert_node;
mod remove_attributes;
mod remove_node;
mod replace_node;
mod tree_path;
#[derive(Clone, Debug, PartialEq)]
pub enum Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
InsertNode(InsertNode<'a, NS, TAG, ATT, VAL>),
AppendChildren(AppendChildren<'a, NS, TAG, ATT, VAL>),
RemoveNode(RemoveNode<'a, TAG>),
ReplaceNode(ReplaceNode<'a, NS, TAG, ATT, VAL>),
AddAttributes(AddAttributes<'a, NS, TAG, ATT, VAL>),
RemoveAttributes(RemoveAttributes<'a, NS, TAG, ATT, VAL>),
ChangeText(ChangeText<'a>),
}
impl<'a, NS, TAG, ATT, VAL> Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
pub fn node_idx(&self) -> usize {
match self {
Patch::InsertNode(ic) => ic.patch_path.node_idx,
Patch::AppendChildren(ac) => ac.patch_path.node_idx,
Patch::RemoveNode(rn) => rn.patch_path.node_idx,
Patch::ReplaceNode(rn) => rn.patch_path.node_idx,
Patch::AddAttributes(at) => at.patch_path.node_idx,
Patch::RemoveAttributes(rt) => rt.patch_path.node_idx,
Patch::ChangeText(ct) => ct.patch_path.node_idx,
}
}
pub fn path(&self) -> &[usize] {
match self {
Patch::InsertNode(ic) => &ic.patch_path.path,
Patch::AppendChildren(ac) => &ac.patch_path.path,
Patch::RemoveNode(rn) => &rn.patch_path.path,
Patch::ReplaceNode(rn) => &rn.patch_path.path,
Patch::AddAttributes(at) => &at.patch_path.path,
Patch::RemoveAttributes(rt) => &rt.patch_path.path,
Patch::ChangeText(ct) => &ct.patch_path.path,
}
}
pub fn tag(&self) -> Option<&TAG> {
match self {
Patch::InsertNode(ic) => ic.tag,
Patch::AppendChildren(ac) => Some(ac.tag),
Patch::RemoveNode(rn) => rn.tag,
Patch::ReplaceNode(rn) => rn.tag,
Patch::AddAttributes(at) => Some(at.tag),
Patch::RemoveAttributes(rt) => Some(rt.tag),
Patch::ChangeText(_) => None,
}
}
}
impl<'a, NS, TAG, ATT, VAL> From<ChangeText<'a>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(ct: ChangeText<'a>) -> Self {
Patch::ChangeText(ct)
}
}
impl<'a, NS, TAG, ATT, VAL> From<InsertNode<'a, NS, TAG, ATT, VAL>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(ic: InsertNode<'a, NS, TAG, ATT, VAL>) -> Self {
Patch::InsertNode(ic)
}
}
impl<'a, NS, TAG, ATT, VAL> From<AppendChildren<'a, NS, TAG, ATT, VAL>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(ac: AppendChildren<'a, NS, TAG, ATT, VAL>) -> Self {
Patch::AppendChildren(ac)
}
}
impl<'a, NS, TAG, ATT, VAL> From<RemoveNode<'a, TAG>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(rc: RemoveNode<'a, TAG>) -> Self {
Patch::RemoveNode(rc)
}
}
impl<'a, NS, TAG, ATT, VAL> From<ReplaceNode<'a, NS, TAG, ATT, VAL>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(rn: ReplaceNode<'a, NS, TAG, ATT, VAL>) -> Self {
Patch::ReplaceNode(rn)
}
}
impl<'a, NS, TAG, ATT, VAL> From<AddAttributes<'a, NS, TAG, ATT, VAL>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(at: AddAttributes<'a, NS, TAG, ATT, VAL>) -> Self {
Patch::AddAttributes(at)
}
}
impl<'a, NS, TAG, ATT, VAL> From<RemoveAttributes<'a, NS, TAG, ATT, VAL>>
for Patch<'a, NS, TAG, ATT, VAL>
where
NS: PartialEq + Clone + Debug,
TAG: PartialEq + Clone + Debug,
ATT: PartialEq + Clone + Debug,
VAL: PartialEq + Clone + Debug,
{
fn from(rt: RemoveAttributes<'a, NS, TAG, ATT, VAL>) -> Self {
Patch::RemoveAttributes(rt)
}
}