Skip to main content

draxl_patch/text/
surface.rs

1use draxl_ast::{NodeId, Span};
2
3/// Unresolved textual patch op parsed from the canonical patch surface.
4#[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    /// Returns the source span for the full patch op entry.
52    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/// Parsed `@id` node reference.
68#[derive(Debug, Clone, PartialEq, Eq)]
69pub struct SurfaceNodeRef {
70    pub id: NodeId,
71    pub span: Span,
72}
73
74/// Parsed owner for a slot ref.
75#[derive(Debug, Clone, PartialEq, Eq)]
76pub enum SurfaceSlotOwner {
77    File { span: Span },
78    Node(SurfaceNodeRef),
79}
80
81/// Parsed slot reference before schema resolution.
82#[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/// Parsed ranked destination before schema resolution.
91#[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/// Parsed move destination before schema resolution.
100#[derive(Debug, Clone, PartialEq, Eq)]
101pub enum SurfaceDest {
102    Ranked(SurfaceRankedDest),
103    Slot(SurfaceSlotRef),
104}
105
106/// Parsed scalar path before schema resolution.
107#[derive(Debug, Clone, PartialEq, Eq)]
108pub struct SurfacePath {
109    pub node: SurfaceNodeRef,
110    pub segments: Vec<SurfacePathSegment>,
111    pub span: Span,
112}
113
114/// Parsed scalar path segment.
115#[derive(Debug, Clone, PartialEq, Eq)]
116pub struct SurfacePathSegment {
117    pub name: String,
118    pub span: Span,
119}
120
121/// Parsed scalar value before type resolution.
122#[derive(Debug, Clone, PartialEq, Eq)]
123pub struct SurfaceValue {
124    pub kind: SurfaceValueKind,
125    pub span: Span,
126}
127
128/// Surface scalar value variants.
129#[derive(Debug, Clone, PartialEq, Eq)]
130pub enum SurfaceValueKind {
131    Ident(String),
132    Str(String),
133    Int(i64),
134    Bool(bool),
135}
136
137/// Fragment source carried verbatim until schema resolution picks a parser.
138#[derive(Debug, Clone, PartialEq, Eq)]
139pub struct SurfaceFragment {
140    pub source: String,
141    pub span: Span,
142}