kodept_ast/graph/
changes.rs1use crate::graph::tags::ChildTag;
2use crate::graph::utils::OptVec;
3use crate::graph::{AnyNode, GenericNodeId, HasChildrenMarker, NodeId};
4use crate::Uninit;
5
6pub type ChangeSet = OptVec<Change>;
7
8pub enum Change {
10 Delete {
12 parent_id: GenericNodeId,
13 child_id: GenericNodeId,
14 },
15 Add {
17 parent_id: GenericNodeId,
18 child: Uninit<AnyNode>,
19 tag: ChildTag,
20 },
21 Replace {
23 from_id: GenericNodeId,
24 to: Uninit<AnyNode>,
25 },
26 DeleteSelf { node_id: GenericNodeId },
28}
29
30impl Change {
31 pub fn delete<T: Into<AnyNode>>(id: NodeId<T>) -> Change {
32 Change::DeleteSelf {
33 node_id: id.widen(),
34 }
35 }
36
37 pub fn add<T, U, const TAG: ChildTag>(to: NodeId<T>, element: Uninit<U>) -> Change
38 where
39 T: Into<AnyNode> + HasChildrenMarker<U, TAG>,
40 U: Into<AnyNode>,
41 {
42 Change::Add {
43 parent_id: to.widen(),
44 child: element.map_into(),
45 tag: TAG,
46 }
47 }
48
49 pub fn replace<T: Into<AnyNode>>(node: NodeId<AnyNode>, with: Uninit<T>) -> Change {
50 Change::Replace {
51 from_id: node.widen(),
52 to: with.map_into(),
53 }
54 }
55}