NetworkService.swift 877 B

123456789101112131415161718192021222324252627282930
  1. import Combine
  2. import Foundation
  3. enum NetworkError: Error, LocalizedError {
  4. case badStatusCode(HTTPResponseStatus)
  5. var errorDescription: String? {
  6. switch self {
  7. case let .badStatusCode(code):
  8. return code.reasonPhrase
  9. }
  10. }
  11. }
  12. struct NetworkService {
  13. func run(_ request: URLRequest) -> AnyPublisher<Data, Error> {
  14. debug(.nightscout, "\(request.httpMethod!) Request at \(request.url!.absoluteString)")
  15. return URLSession.shared
  16. .dataTaskPublisher(for: request)
  17. .tryMap { data, response in
  18. let code = (response as! HTTPURLResponse).statusCode
  19. guard 200 ..< 300 ~= code else {
  20. throw NetworkError.badStatusCode(.init(statusCode: code))
  21. }
  22. return data
  23. }
  24. .eraseToAnyPublisher()
  25. }
  26. }