mirror of
https://github.com/LukeHagar/plexswift.git
synced 2025-12-06 20:57:46 +00:00
38 lines
1.4 KiB
Swift
38 lines
1.4 KiB
Swift
// Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.
|
|
|
|
import Foundation
|
|
|
|
enum StringSubstitutionError: Swift.Error {
|
|
case `internal`
|
|
case missingParameter(named: String, in: String)
|
|
}
|
|
|
|
extension String {
|
|
typealias SubstitutionHandler = (_ key: String) throws -> String?
|
|
|
|
func substituteComponents(using substitutionHandler: SubstitutionHandler) throws -> String {
|
|
let regex = try NSRegularExpression(pattern: "\\{([^}]+)\\}")
|
|
let range = NSRange(startIndex..<endIndex, in: self)
|
|
let matches = regex.matches(in: self, range: range)
|
|
|
|
var substitutedPath = self
|
|
// Reverse matches so that we can replace substrings in place.
|
|
for match in matches.reversed() {
|
|
let templateRange = match.range
|
|
guard let keyRange = Range(match.range(at: 1), in: self) else {
|
|
throw StringSubstitutionError.internal
|
|
}
|
|
|
|
let key = String(self[keyRange])
|
|
guard let serializedParameter = try substitutionHandler(key) else {
|
|
throw StringSubstitutionError.missingParameter(named: key, in: self)
|
|
}
|
|
|
|
let startIndex = substitutedPath.index(substitutedPath.startIndex, offsetBy: templateRange.location)
|
|
let endIndex = substitutedPath.index(startIndex, offsetBy: templateRange.length)
|
|
substitutedPath.replaceSubrange(startIndex..<endIndex, with: serializedParameter)
|
|
}
|
|
return substitutedPath
|
|
}
|
|
}
|