
ბოლოსადი კლასი NetworkService {
func request<Response: Decodable, Body: Encodable>(urlString: String, method: HTTPMethod, body: Body? = nil, headers: [String: String] = [:], query: [String: String] = [:]) async throws -> Response {
guard var components = URLComponents(string: urlString) else {
throw Errors.invalidUrl
}
if !query.isEmpty {
components.queryItems = query.map {
URLQueryItem(name: $0.key, value: $0.value)
}
}
guard let url = components.url else {
throw Errors.invalidQuery
}
var request = URLRequest(url: url)
request.httpMethod = method.rawValue
headers.forEach {
request.setValue($0.value, forHTTPHeaderField: $0.key)
}
if let body, method == .post {
request.httpBody = try encoder.encode(body)
// ?
}
let (data, response) = try await session.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
throw Errors.invalidResponse
}
guard (200...299).contains(httpResponse.statusCode) else {
throw Errors.httpStatus(httpResponse.statusCode)
}
return try decoder.decode(Response.self, from: data)
}
}