1use draxl_ast::{NodeId, Span};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum SurfacePatchOp {
6 Insert {
7 dest: SurfaceRankedDest,
8 fragment: SurfaceFragment,
9 span: Span,
10 },
11 Put {
12 slot: SurfaceSlotRef,
13 fragment: SurfaceFragment,
14 span: Span,
15 },
16 Replace {
17 target: SurfaceNodeRef,
18 fragment: SurfaceFragment,
19 span: Span,
20 },
21 Delete {
22 target: SurfaceNodeRef,
23 span: Span,
24 },
25 Move {
26 target: SurfaceNodeRef,
27 dest: SurfaceDest,
28 span: Span,
29 },
30 Set {
31 path: SurfacePath,
32 value: SurfaceValue,
33 span: Span,
34 },
35 Clear {
36 path: SurfacePath,
37 span: Span,
38 },
39 Attach {
40 node: SurfaceNodeRef,
41 target: SurfaceNodeRef,
42 span: Span,
43 },
44 Detach {
45 node: SurfaceNodeRef,
46 span: Span,
47 },
48}
49
50impl SurfacePatchOp {
51 pub fn span(&self) -> Span {
53 match self {
54 Self::Insert { span, .. }
55 | Self::Put { span, .. }
56 | Self::Replace { span, .. }
57 | Self::Delete { span, .. }
58 | Self::Move { span, .. }
59 | Self::Set { span, .. }
60 | Self::Clear { span, .. }
61 | Self::Attach { span, .. }
62 | Self::Detach { span, .. } => *span,
63 }
64 }
65}
66
67#[derive(Debug, Clone, PartialEq, Eq)]
69pub struct SurfaceNodeRef {
70 pub id: NodeId,
71 pub span: Span,
72}
73
74#[derive(Debug, Clone, PartialEq, Eq)]
76pub enum SurfaceSlotOwner {
77 File { span: Span },
78 Node(SurfaceNodeRef),
79}
80
81#[derive(Debug, Clone, PartialEq, Eq)]
83pub struct SurfaceSlotRef {
84 pub owner: SurfaceSlotOwner,
85 pub slot: String,
86 pub slot_span: Span,
87 pub span: Span,
88}
89
90#[derive(Debug, Clone, PartialEq, Eq)]
92pub struct SurfaceRankedDest {
93 pub slot: SurfaceSlotRef,
94 pub rank: String,
95 pub rank_span: Span,
96 pub span: Span,
97}
98
99#[derive(Debug, Clone, PartialEq, Eq)]
101pub enum SurfaceDest {
102 Ranked(SurfaceRankedDest),
103 Slot(SurfaceSlotRef),
104}
105
106#[derive(Debug, Clone, PartialEq, Eq)]
108pub struct SurfacePath {
109 pub node: SurfaceNodeRef,
110 pub segments: Vec<SurfacePathSegment>,
111 pub span: Span,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq)]
116pub struct SurfacePathSegment {
117 pub name: String,
118 pub span: Span,
119}
120
121#[derive(Debug, Clone, PartialEq, Eq)]
123pub struct SurfaceValue {
124 pub kind: SurfaceValueKind,
125 pub span: Span,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq)]
130pub enum SurfaceValueKind {
131 Ident(String),
132 Str(String),
133 Int(i64),
134 Bool(bool),
135}
136
137#[derive(Debug, Clone, PartialEq, Eq)]
139pub struct SurfaceFragment {
140 pub source: String,
141 pub span: Span,
142}