1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
5pub struct Identifier {
6 pub name: String,
7 #[serde(with = "oak_core::serde_range")]
8 pub span: Range<usize>,
9}
10
11#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
13pub struct RegexRoot {
14 pub alternatives: Vec<Pattern>,
15}
16
17#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
19pub struct Pattern {
20 pub alternatives: Vec<Alternative>,
21 #[serde(with = "oak_core::serde_range")]
22 pub span: Range<usize>,
23}
24
25#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
27pub struct Alternative {
28 pub elements: Vec<PatternElement>,
29 #[serde(with = "oak_core::serde_range")]
30 pub span: Range<usize>,
31}
32
33#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
35pub enum PatternElement {
36 CharacterClass(CharacterClass),
38 Quantifier(Quantifier),
40 Group(Group),
42 Assertion(Assertion),
44 Literal(Literal),
46 Special(Special),
48}
49
50#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
52pub struct CharacterClass {
53 pub negated: bool,
54 pub ranges: Vec<CharacterRange>,
55 #[serde(with = "oak_core::serde_range")]
56 pub span: Range<usize>,
57}
58
59#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
61pub struct CharacterRange {
62 pub start: char,
63 pub end: Option<char>, #[serde(with = "oak_core::serde_range")]
65 pub span: Range<usize>,
66}
67
68#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
70pub struct Quantifier {
71 pub element: Box<PatternElement>,
72 pub kind: QuantifierKind,
73 pub greedy: bool,
74 #[serde(with = "oak_core::serde_range")]
75 pub span: Range<usize>,
76}
77
78#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
80pub enum QuantifierKind {
81 ZeroOrOne,
83 ZeroOrMore,
85 OneOrMore,
87 Exact(u32),
89 Range(u32, Option<u32>), }
92
93#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
95pub struct Group {
96 pub kind: GroupKind,
97 pub element: Box<PatternElement>,
98 #[serde(with = "oak_core::serde_range")]
99 pub span: Range<usize>,
100}
101
102#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
104pub enum GroupKind {
105 Capturing(Option<u32>), NonCapturing,
109 Lookahead,
111 NegativeLookahead,
113 Lookbehind,
115 NegativeLookbehind,
117 Atomic,
119 Conditional(Condition),
121}
122
123#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
125pub enum Condition {
126 GroupNumber(u32),
128 Recursion,
130 Assertion(Box<PatternElement>),
132}
133
134#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
136pub struct Assertion {
137 pub kind: AssertionKind,
138 #[serde(with = "oak_core::serde_range")]
139 pub span: Range<usize>,
140}
141
142#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
144pub enum AssertionKind {
145 Start,
147 End,
149 WordBoundary,
151 NonWordBoundary,
153}
154
155#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
157pub struct Literal {
158 pub value: String,
159 #[serde(with = "oak_core::serde_range")]
160 pub span: Range<usize>,
161}
162
163#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
165pub struct Special {
166 pub kind: SpecialKind,
167 #[serde(with = "oak_core::serde_range")]
168 pub span: Range<usize>,
169}
170
171#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
173pub enum SpecialKind {
174 Any,
176 Digit,
178 NonDigit,
180 Word,
182 NonWord,
184 Whitespace,
186 NonWhitespace,
188 Backspace,
190 FormFeed,
192 Newline,
194 CarriageReturn,
196 Tab,
198 VerticalTab,
200 Octal(u32),
202 Hexadecimal(u32),
204 Unicode(u32),
206 Control(char),
208 NamedReference(String),
210}