Fluent Builder Pattern
Fluent builder pattern for constructing complex URLRequest objects.
final class RequestBuilder {
private var method: String = "GET"
private var url: URL?
private var headers: [String: String] = [:]
private var body: Data?
private var timeout: TimeInterval = 30
func method(_ method: String) -> RequestBuilder {
self.method = method
return self
}
func url(_ url: URL) -> RequestBuilder {
self.url = url
return self
}
func header(_ key: String, _ value: String) -> RequestBuilder {
headers[key] = value
return self
}
func jsonBody<T: Encodable>(_ body: T) throws -> RequestBuilder {
self.body = try JSONEncoder().encode(body)
headers["Content-Type"] = "application/json"
return self
}
func timeout(_ timeout: TimeInterval) -> RequestBuilder {
self.timeout = timeout
return self
}
func build() throws -> URLRequest {
guard let url = url else {
throw BuilderError.missingURL
}
var request = URLRequest(url: url)
request.httpMethod = method
request.httpBody = body
request.timeoutInterval = timeout
headers.forEach { request.setValue($1, forHTTPHeaderField: $0) }
return request
}
enum BuilderError: Error { case missingURL }
}
// Usage:
// let request = try RequestBuilder()
// .method("POST")
// .url(URL(string: "https://api.example.com/users")!)
// .header("Authorization", "Bearer token")
// .jsonBody(["name": "John"])
// .build()