Skip to content

Commit 88f6454

Browse files
authored
Move off of RegexBuilder for URL.Template (#1273)
* Revert RegexBuilder workaround * Cleanup private * Move off of RegexBuilder
1 parent 9f3a180 commit 88f6454

File tree

5 files changed

+11
-59
lines changed

5 files changed

+11
-59
lines changed

Sources/FoundationEssentials/URL/URLTemplate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ extension URL {
130130
}
131131

132132
// MARK: - Parse
133-
#if FOUNDATION_FRAMEWORK
133+
134134
@available(FoundationPreview 6.2, *)
135135
extension URL.Template {
136136
/// Creates a new template from its text form.
@@ -165,7 +165,6 @@ extension URL.Template {
165165
}
166166
}
167167
}
168-
#endif
169168

170169
// MARK: -
171170

@@ -178,6 +177,7 @@ extension URL.Template: CustomStringConvertible {
178177
}
179178
}
180179

180+
@available(FoundationPreview 6.2, *)
181181
extension URL.Template.Element: CustomStringConvertible {
182182
var description: String {
183183
switch self {

Sources/FoundationEssentials/URL/URLTemplate_Expression.swift

Lines changed: 7 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#if FOUNDATION_FRAMEWORK
14-
internal import RegexBuilder
15-
#endif
16-
1713
#if canImport(CollectionsInternal)
1814
internal import CollectionsInternal
1915
#elseif canImport(OrderedCollections)
@@ -82,7 +78,6 @@ extension URL.Template.Expression.Element: CustomStringConvertible {
8278
}
8379
}
8480

85-
#if FOUNDATION_FRAMEWORK
8681
extension URL.Template.Expression {
8782
init(_ input: String) throws {
8883
var remainder = input[...]
@@ -108,7 +103,7 @@ extension URL.Template.Expression {
108103
let explode: Bool
109104
if let max = match.output.3 {
110105
guard
111-
let m = max.map({ Int($0) })
106+
let m = Int(max)
112107
else { throw URL.Template.InvalidExpression(text: "Invalid maximum length '\(input[match.range])'") }
113108
maximumLength = m
114109
explode = false
@@ -152,61 +147,26 @@ extension URL.Template {
152147

153148
let operatorRegex: Regex<(Substring, Substring?)>
154149
let separatorRegex: Regex<(Substring)>
155-
let elementRegex: Regex<(Substring, Substring, Substring?, Substring??)>
156-
let uriTemplateRegex: Regex<Regex<(Substring, Regex<OneOrMore<Substring>.RegexOutput>.RegexOutput)>.RegexOutput>
150+
let elementRegex: Regex<(Substring, Substring, Substring?, Substring?)>
151+
let uriTemplateRegex: Regex<(Substring, Substring)>
157152

158153
private init() {
159-
self.operatorRegex = Regex {
160-
Optionally {
161-
Capture {
162-
One(.anyOf("+#./;?&"))
163-
}
164-
}
165-
}
154+
self.operatorRegex = try! Regex(#"([\+#.\/;\?&])?"#)
166155
.asciiOnlyWordCharacters()
167156
.asciiOnlyDigits()
168157
.asciiOnlyCharacterClasses()
169-
self.separatorRegex = Regex {
170-
","
171-
}
158+
self.separatorRegex = try! Regex(#","#)
172159
.asciiOnlyWordCharacters()
173160
.asciiOnlyDigits()
174161
.asciiOnlyCharacterClasses()
175-
self.elementRegex = Regex {
176-
Capture {
177-
One(("a"..."z").union("A"..."Z"))
178-
ZeroOrMore(("a"..."z").union("A"..."Z").union("0"..."9").union(.anyOf("_")))
179-
}
180-
Optionally {
181-
Capture {
182-
ChoiceOf {
183-
Regex {
184-
":"
185-
Capture {
186-
ZeroOrMore(.digit)
187-
}
188-
}
189-
"*"
190-
}
191-
}
192-
}
193-
}
162+
self.elementRegex = try! Regex(#"([a-zA-Z][a-zA-Z0-9_]*)(:([0-9]*)|\*)?"#)
194163
.asciiOnlyWordCharacters()
195164
.asciiOnlyDigits()
196165
.asciiOnlyCharacterClasses()
197-
self.uriTemplateRegex = Regex {
198-
"{"
199-
Capture {
200-
OneOrMore {
201-
CharacterClass.any.subtracting(.anyOf("}"))
202-
}
203-
}
204-
"}"
205-
}
166+
self.uriTemplateRegex = try! Regex(#"{([^}]+)}"#)
206167
}
207168
}
208169
}
209-
#endif
210170

211171
// .------------------------------------------------------------------.
212172
// | NUL + . / ; ? & # |

Sources/FoundationEssentials/URL/URLTemplate_PercentEncoding.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#if FOUNDATION_FRAMEWORK
14-
internal import RegexBuilder
15-
#endif
16-
1713
extension String {
1814
/// Convert to NFC and percent-escape.
1915
func normalizedAddingPercentEncoding(

Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_ExpressionTests.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ import struct Foundation.URL
2020
#endif
2121
import Testing
2222

23-
#if FOUNDATION_FRAMEWORK
2423
@Suite("URL.Template Expression")
2524
private enum ExpressionTests {
26-
private typealias Expression = URL.Template.Expression
27-
private typealias Element = URL.Template.Expression.Element
25+
typealias Expression = URL.Template.Expression
26+
typealias Element = URL.Template.Expression.Element
2827

2928
@Test
3029
static func parsingWithSingleName() throws {
@@ -277,4 +276,3 @@ private enum ExpressionTests {
277276
#expect((try? Expression(input)) == nil, "Should fail to parse, but not crash.")
278277
}
279278
}
280-
#endif

Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_TemplateTests.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ private var variables: [URL.Template.VariableName: URL.Template.Value] {
4747
]
4848
}
4949

50-
#if FOUNDATION_FRAMEWORK
5150
private func assertReplacing(template: String, result: String, sourceLocation: SourceLocation = #_sourceLocation) {
5251
do {
5352
let t = try #require(URL.Template(template))
@@ -257,4 +256,3 @@ private enum TemplateTests {
257256
assertReplacing(template: "{&keys*}", result: "&semi=%3B&dot=.&comma=%2C")
258257
}
259258
}
260-
#endif

0 commit comments

Comments
 (0)