diff --git a/Sources/FoundationEssentials/URL/URLTemplate.swift b/Sources/FoundationEssentials/URL/URLTemplate.swift index 57f3dc973..a90863dfd 100644 --- a/Sources/FoundationEssentials/URL/URLTemplate.swift +++ b/Sources/FoundationEssentials/URL/URLTemplate.swift @@ -130,7 +130,7 @@ extension URL { } // MARK: - Parse -#if FOUNDATION_FRAMEWORK + @available(FoundationPreview 6.2, *) extension URL.Template { /// Creates a new template from its text form. @@ -165,7 +165,6 @@ extension URL.Template { } } } -#endif // MARK: - @@ -178,6 +177,7 @@ extension URL.Template: CustomStringConvertible { } } +@available(FoundationPreview 6.2, *) extension URL.Template.Element: CustomStringConvertible { var description: String { switch self { diff --git a/Sources/FoundationEssentials/URL/URLTemplate_Expression.swift b/Sources/FoundationEssentials/URL/URLTemplate_Expression.swift index 6e7a0fbc9..e368f354d 100644 --- a/Sources/FoundationEssentials/URL/URLTemplate_Expression.swift +++ b/Sources/FoundationEssentials/URL/URLTemplate_Expression.swift @@ -10,10 +10,6 @@ // //===----------------------------------------------------------------------===// -#if FOUNDATION_FRAMEWORK -internal import RegexBuilder -#endif - #if canImport(CollectionsInternal) internal import CollectionsInternal #elseif canImport(OrderedCollections) @@ -82,7 +78,6 @@ extension URL.Template.Expression.Element: CustomStringConvertible { } } -#if FOUNDATION_FRAMEWORK extension URL.Template.Expression { init(_ input: String) throws { var remainder = input[...] @@ -108,7 +103,7 @@ extension URL.Template.Expression { let explode: Bool if let max = match.output.3 { guard - let m = max.map({ Int($0) }) + let m = Int(max) else { throw URL.Template.InvalidExpression(text: "Invalid maximum length '\(input[match.range])'") } maximumLength = m explode = false @@ -152,61 +147,26 @@ extension URL.Template { let operatorRegex: Regex<(Substring, Substring?)> let separatorRegex: Regex<(Substring)> - let elementRegex: Regex<(Substring, Substring, Substring?, Substring??)> - let uriTemplateRegex: Regex.RegexOutput>.RegexOutput)>.RegexOutput> + let elementRegex: Regex<(Substring, Substring, Substring?, Substring?)> + let uriTemplateRegex: Regex<(Substring, Substring)> private init() { - self.operatorRegex = Regex { - Optionally { - Capture { - One(.anyOf("+#./;?&")) - } - } - } + self.operatorRegex = try! Regex(#"([\+#.\/;\?&])?"#) .asciiOnlyWordCharacters() .asciiOnlyDigits() .asciiOnlyCharacterClasses() - self.separatorRegex = Regex { - "," - } + self.separatorRegex = try! Regex(#","#) .asciiOnlyWordCharacters() .asciiOnlyDigits() .asciiOnlyCharacterClasses() - self.elementRegex = Regex { - Capture { - One(("a"..."z").union("A"..."Z")) - ZeroOrMore(("a"..."z").union("A"..."Z").union("0"..."9").union(.anyOf("_"))) - } - Optionally { - Capture { - ChoiceOf { - Regex { - ":" - Capture { - ZeroOrMore(.digit) - } - } - "*" - } - } - } - } + self.elementRegex = try! Regex(#"([a-zA-Z][a-zA-Z0-9_]*)(:([0-9]*)|\*)?"#) .asciiOnlyWordCharacters() .asciiOnlyDigits() .asciiOnlyCharacterClasses() - self.uriTemplateRegex = Regex { - "{" - Capture { - OneOrMore { - CharacterClass.any.subtracting(.anyOf("}")) - } - } - "}" - } + self.uriTemplateRegex = try! Regex(#"{([^}]+)}"#) } } } -#endif // .------------------------------------------------------------------. // | NUL + . / ; ? & # | diff --git a/Sources/FoundationEssentials/URL/URLTemplate_PercentEncoding.swift b/Sources/FoundationEssentials/URL/URLTemplate_PercentEncoding.swift index 79f39cb58..6b1a760fe 100644 --- a/Sources/FoundationEssentials/URL/URLTemplate_PercentEncoding.swift +++ b/Sources/FoundationEssentials/URL/URLTemplate_PercentEncoding.swift @@ -10,10 +10,6 @@ // //===----------------------------------------------------------------------===// -#if FOUNDATION_FRAMEWORK -internal import RegexBuilder -#endif - extension String { /// Convert to NFC and percent-escape. func normalizedAddingPercentEncoding( diff --git a/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_ExpressionTests.swift b/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_ExpressionTests.swift index 2a98f9593..111bcd715 100644 --- a/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_ExpressionTests.swift +++ b/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_ExpressionTests.swift @@ -20,11 +20,10 @@ import struct Foundation.URL #endif import Testing -#if FOUNDATION_FRAMEWORK @Suite("URL.Template Expression") private enum ExpressionTests { - private typealias Expression = URL.Template.Expression - private typealias Element = URL.Template.Expression.Element + typealias Expression = URL.Template.Expression + typealias Element = URL.Template.Expression.Element @Test static func parsingWithSingleName() throws { @@ -277,4 +276,3 @@ private enum ExpressionTests { #expect((try? Expression(input)) == nil, "Should fail to parse, but not crash.") } } -#endif diff --git a/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_TemplateTests.swift b/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_TemplateTests.swift index b1cab9ff2..717b04adf 100644 --- a/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_TemplateTests.swift +++ b/Tests/FoundationEssentialsTests/URITemplatingTests/URLTemplate_TemplateTests.swift @@ -47,7 +47,6 @@ private var variables: [URL.Template.VariableName: URL.Template.Value] { ] } -#if FOUNDATION_FRAMEWORK private func assertReplacing(template: String, result: String, sourceLocation: SourceLocation = #_sourceLocation) { do { let t = try #require(URL.Template(template)) @@ -257,4 +256,3 @@ private enum TemplateTests { assertReplacing(template: "{&keys*}", result: "&semi=%3B&dot=.&comma=%2C") } } -#endif