import Foundation /// Übersetzt eine HTTP-Antwort in entweder Nutzdaten oder einen `PlexError`. public enum PlexResponse { public static func validate( data: Data, response: URLResponse ) throws(PlexError) -> Data { guard let http = response as? HTTPURLResponse else { throw .transport(description: "Antwort war keine HTTP-Antwort") } switch http.statusCode { case 200..<300: return data case 401, 403: throw .unauthorized case 404: throw .notFound default: throw .server(status: http.statusCode) } } public static func decode( _ type: T.Type, from data: Data ) throws(PlexError) -> T { do { return try JSONDecoder().decode(type, from: data) } catch { // Der Fehlertext von `DecodingError` nennt den Schlüsselpfad. Das // ist beim Nachziehen einer geänderten Plex-Version Gold wert, // deshalb wird er mitgeschleppt statt verschluckt. throw .decoding(description: String(describing: error)) } } }