40 lines
984 B
Swift
40 lines
984 B
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public struct URLPathComponents: ExpressibleByArrayLiteral, Equatable {
|
|
private static var allowedCharacters: CharacterSet {
|
|
var result = CharacterSet.urlPathAllowed
|
|
result.remove("/")
|
|
return result
|
|
}
|
|
|
|
private let pathComponents: [String]
|
|
|
|
public init(_ pathComponents: [String]) {
|
|
self.pathComponents = pathComponents
|
|
}
|
|
|
|
public init(arrayLiteral: String...) {
|
|
self.pathComponents = arrayLiteral
|
|
}
|
|
|
|
public var percentEncoded: String {
|
|
pathComponents
|
|
.compactMap {
|
|
$0.nilIfEmpty?.addingPercentEncoding(withAllowedCharacters: Self.allowedCharacters)
|
|
}
|
|
.joined(separator: "/")
|
|
}
|
|
}
|
|
|
|
// MARK: - URL extension
|
|
|
|
public extension URL {
|
|
init?(pathComponents: URLPathComponents) {
|
|
self.init(string: pathComponents.percentEncoded)
|
|
}
|
|
}
|