import Foundation /// Was beim Sprechen mit Plex schiefgehen kann. /// /// Bewusst grob geschnitten: die Oberfläche muss unterscheiden können, ob sie /// zur Anmeldung zurückschicken (`unauthorized`), einen Wiederholen-Knopf /// zeigen (`transport`) oder einen Fehler melden soll. Feinere Abstufungen /// hätten kein anderes Verhalten zur Folge. public enum PlexError: Error, Sendable, Equatable { /// Token fehlt oder wurde am Server zurückgezogen. case unauthorized /// Angefragte Ressource gibt es nicht — etwa ein gelöschter Titel. case notFound /// Der Server hat geantwortet, aber mit einem Fehlerstatus. case server(status: Int) /// Verbindung kam nicht zustande. Der Grund steht als Text drin, damit die /// Fehlermeldung konkret werden kann statt „Etwas ist schiefgelaufen". case transport(description: String) /// Antwort kam an, ließ sich aber nicht lesen. Fast immer ein Zeichen /// dafür, dass ein Feld in einer neueren Plex-Version anders heißt. case decoding(description: String) /// Es war kein Weg zum Server erreichbar — weder lokal noch über plex.tv. case noReachableConnection /// Ob ein erneuter Versuch überhaupt Aussicht auf Erfolg hat. Steuert, ob /// die Oberfläche einen Wiederholen-Knopf anbietet. public var isRetryable: Bool { switch self { case .transport, .noReachableConnection: true case .server(let status): // 5xx ist ein Serverproblem und kann vorübergehen; 4xx liegt an // der Anfrage und wird beim zweiten Mal genauso scheitern. status >= 500 case .unauthorized, .notFound, .decoding: false } } }