[create-pull-request] automated change
This commit is contained in:
parent
5a96120722
commit
7532aa564c
|
@ -11,16 +11,16 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
struct ErrorMessage: Identifiable {
|
struct ErrorMessage: Identifiable {
|
||||||
|
|
||||||
let code: Int
|
let code: Int
|
||||||
let title: String
|
let title: String
|
||||||
let displayMessage: String
|
let displayMessage: String
|
||||||
let logConstructor: LogConstructor
|
let logConstructor: LogConstructor
|
||||||
|
|
||||||
var id: String {
|
var id: String {
|
||||||
return "\(code)\(title)\(logConstructor.message)"
|
return "\(code)\(title)\(logConstructor.message)"
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the custom displayMessage is `nil`, it will be set to the given logConstructor's message
|
/// If the custom displayMessage is `nil`, it will be set to the given logConstructor's message
|
||||||
init(code: Int, title: String, displayMessage: String?, logConstructor: LogConstructor) {
|
init(code: Int, title: String, displayMessage: String?, logConstructor: LogConstructor) {
|
||||||
self.code = code
|
self.code = code
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The implementation of the network errors here are a temporary measure.
|
The implementation of the network errors here are a temporary measure.
|
||||||
It is very repetitive, messy, and doesn't fulfill the entire specification of "error reporting".
|
It is very repetitive, messy, and doesn't fulfill the entire specification of "error reporting".
|
||||||
|
@ -18,16 +17,16 @@ import JellyfinAPI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum NetworkError: Error {
|
enum NetworkError: Error {
|
||||||
|
|
||||||
/// For the case that the ErrorResponse object has a code of -1
|
/// For the case that the ErrorResponse object has a code of -1
|
||||||
case URLError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
case URLError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
||||||
|
|
||||||
/// For the case that the ErrorRespones object has a code of -2
|
/// For the case that the ErrorRespones object has a code of -2
|
||||||
case HTTPURLError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
case HTTPURLError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
||||||
|
|
||||||
/// For the case that the ErrorResponse object has a positive code
|
/// For the case that the ErrorResponse object has a positive code
|
||||||
case JellyfinError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
case JellyfinError(response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor)
|
||||||
|
|
||||||
var errorMessage: ErrorMessage {
|
var errorMessage: ErrorMessage {
|
||||||
switch self {
|
switch self {
|
||||||
case .URLError(let response, let displayMessage, let logConstructor):
|
case .URLError(let response, let displayMessage, let logConstructor):
|
||||||
|
@ -38,11 +37,11 @@ enum NetworkError: Error {
|
||||||
return NetworkError.parseJellyfinError(from: response, displayMessage: displayMessage, logConstructor: logConstructor)
|
return NetworkError.parseJellyfinError(from: response, displayMessage: displayMessage, logConstructor: logConstructor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func logMessage() {
|
func logMessage() {
|
||||||
let logConstructor = errorMessage.logConstructor
|
let logConstructor = errorMessage.logConstructor
|
||||||
let logFunction: (@autoclosure () -> String, String, String, String, UInt) -> Void
|
let logFunction: (@autoclosure () -> String, String, String, String, UInt) -> Void
|
||||||
|
|
||||||
switch logConstructor.level {
|
switch logConstructor.level {
|
||||||
case .trace:
|
case .trace:
|
||||||
logFunction = LogManager.shared.log.trace
|
logFunction = LogManager.shared.log.trace
|
||||||
|
@ -59,19 +58,19 @@ enum NetworkError: Error {
|
||||||
case ._none:
|
case ._none:
|
||||||
logFunction = LogManager.shared.log.debug
|
logFunction = LogManager.shared.log.debug
|
||||||
}
|
}
|
||||||
|
|
||||||
logFunction(logConstructor.message, logConstructor.tag, logConstructor.function, logConstructor.file, logConstructor.line)
|
logFunction(logConstructor.message, logConstructor.tag, logConstructor.function, logConstructor.file, logConstructor.line)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func parseURLError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
private static func parseURLError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
||||||
|
|
||||||
let errorMessage: ErrorMessage
|
let errorMessage: ErrorMessage
|
||||||
var logMessage = "An error has occurred."
|
var logMessage = "An error has occurred."
|
||||||
var logConstructor = logConstructor
|
var logConstructor = logConstructor
|
||||||
|
|
||||||
switch response {
|
switch response {
|
||||||
case .error(_, _, _, let err):
|
case .error(_, _, _, let err):
|
||||||
|
|
||||||
// These codes are currently referenced from:
|
// These codes are currently referenced from:
|
||||||
// https://developer.apple.com/documentation/foundation/1508628-url_loading_system_error_codes
|
// https://developer.apple.com/documentation/foundation/1508628-url_loading_system_error_codes
|
||||||
switch err._code {
|
switch err._code {
|
||||||
|
@ -97,38 +96,38 @@ enum NetworkError: Error {
|
||||||
logConstructor: logConstructor)
|
logConstructor: logConstructor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return errorMessage
|
return errorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func parseHTTPURLError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
private static func parseHTTPURLError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
||||||
|
|
||||||
let errorMessage: ErrorMessage
|
let errorMessage: ErrorMessage
|
||||||
let logMessage = "An HTTP URL error has occurred"
|
let logMessage = "An HTTP URL error has occurred"
|
||||||
var logConstructor = logConstructor
|
var logConstructor = logConstructor
|
||||||
|
|
||||||
// Not implemented as has not run into one of these errors as time of writing
|
// Not implemented as has not run into one of these errors as time of writing
|
||||||
switch response {
|
switch response {
|
||||||
case .error(_, _, _, _):
|
case .error:
|
||||||
logConstructor.message = logMessage
|
logConstructor.message = logMessage
|
||||||
errorMessage = ErrorMessage(code: 0,
|
errorMessage = ErrorMessage(code: 0,
|
||||||
title: "Error",
|
title: "Error",
|
||||||
displayMessage: displayMessage,
|
displayMessage: displayMessage,
|
||||||
logConstructor: logConstructor)
|
logConstructor: logConstructor)
|
||||||
}
|
}
|
||||||
|
|
||||||
return errorMessage
|
return errorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func parseJellyfinError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
private static func parseJellyfinError(from response: ErrorResponse, displayMessage: String?, logConstructor: LogConstructor) -> ErrorMessage {
|
||||||
|
|
||||||
let errorMessage: ErrorMessage
|
let errorMessage: ErrorMessage
|
||||||
var logMessage = "An error has occurred."
|
var logMessage = "An error has occurred."
|
||||||
var logConstructor = logConstructor
|
var logConstructor = logConstructor
|
||||||
|
|
||||||
switch response {
|
switch response {
|
||||||
case .error(let code, _, _, _):
|
case .error(let code, _, _, _):
|
||||||
|
|
||||||
// Generic HTTP status codes
|
// Generic HTTP status codes
|
||||||
switch code {
|
switch code {
|
||||||
case 401:
|
case 401:
|
||||||
|
@ -146,7 +145,7 @@ enum NetworkError: Error {
|
||||||
logConstructor: logConstructor)
|
logConstructor: logConstructor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return errorMessage
|
return errorMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
final class ConnectToServerViewModel: ViewModel {
|
final class ConnectToServerViewModel: ViewModel {
|
||||||
|
|
||||||
@Published var isConnectedServer = false
|
@Published var isConnectedServer = false
|
||||||
|
|
||||||
var uriSubject = CurrentValueSubject<String, Never>("")
|
var uriSubject = CurrentValueSubject<String, Never>("")
|
||||||
|
|
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
class DetailItemViewModel: ViewModel {
|
class DetailItemViewModel: ViewModel {
|
||||||
|
|
||||||
@Published var item: BaseItemDto
|
@Published var item: BaseItemDto
|
||||||
@Published var similarItems: [BaseItemDto] = []
|
@Published var similarItems: [BaseItemDto] = []
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
final class LatestMediaViewModel: ViewModel {
|
final class LatestMediaViewModel: ViewModel {
|
||||||
|
|
||||||
@Published var items = [BaseItemDto]()
|
@Published var items = [BaseItemDto]()
|
||||||
|
|
||||||
var libraryID: String
|
var libraryID: String
|
||||||
|
|
|
@ -20,7 +20,7 @@ enum FilterType {
|
||||||
}
|
}
|
||||||
|
|
||||||
final class LibraryFilterViewModel: ViewModel {
|
final class LibraryFilterViewModel: ViewModel {
|
||||||
|
|
||||||
@Published var modifiedFilters = LibraryFilters()
|
@Published var modifiedFilters = LibraryFilters()
|
||||||
|
|
||||||
@Published var possibleGenres = [NameGuidPair]()
|
@Published var possibleGenres = [NameGuidPair]()
|
||||||
|
|
|
@ -11,7 +11,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
final class LibraryListViewModel: ViewModel {
|
final class LibraryListViewModel: ViewModel {
|
||||||
|
|
||||||
@Published var libraries = [BaseItemDto]()
|
@Published var libraries = [BaseItemDto]()
|
||||||
|
|
||||||
// temp
|
// temp
|
||||||
|
|
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
final class SeasonItemViewModel: DetailItemViewModel {
|
final class SeasonItemViewModel: DetailItemViewModel {
|
||||||
|
|
||||||
@Published var episodes = [BaseItemDto]()
|
@Published var episodes = [BaseItemDto]()
|
||||||
|
|
||||||
override init(item: BaseItemDto) {
|
override init(item: BaseItemDto) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
final class SeriesItemViewModel: DetailItemViewModel {
|
final class SeriesItemViewModel: DetailItemViewModel {
|
||||||
|
|
||||||
@Published var seasons = [BaseItemDto]()
|
@Published var seasons = [BaseItemDto]()
|
||||||
@Published var nextUpItem: BaseItemDto?
|
@Published var nextUpItem: BaseItemDto?
|
||||||
|
|
||||||
|
|
|
@ -13,27 +13,27 @@ import ActivityIndicator
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
class ViewModel: ObservableObject {
|
class ViewModel: ObservableObject {
|
||||||
|
|
||||||
@Published var isLoading = true
|
@Published var isLoading = true
|
||||||
@Published var errorMessage: ErrorMessage?
|
@Published var errorMessage: ErrorMessage?
|
||||||
|
|
||||||
let loading = ActivityIndicator()
|
let loading = ActivityIndicator()
|
||||||
var cancellables = Set<AnyCancellable>()
|
var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
loading.loading.assign(to: \.isLoading, on: self).store(in: &cancellables)
|
loading.loading.assign(to: \.isLoading, on: self).store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleAPIRequestError(displayMessage: String? = nil, logLevel: LogLevel = .error, tag: String = "", function: String = #function, file: String = #file, line: UInt = #line, completion: Subscribers.Completion<Error>) {
|
func handleAPIRequestError(displayMessage: String? = nil, logLevel: LogLevel = .error, tag: String = "", function: String = #function, file: String = #file, line: UInt = #line, completion: Subscribers.Completion<Error>) {
|
||||||
switch completion {
|
switch completion {
|
||||||
case .finished:
|
case .finished:
|
||||||
break
|
break
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
if let errorResponse = error as? ErrorResponse {
|
if let errorResponse = error as? ErrorResponse {
|
||||||
|
|
||||||
let networkError: NetworkError
|
let networkError: NetworkError
|
||||||
let logConstructor = LogConstructor(message: "__NOTHING__", tag: tag, level: logLevel, function: function, file: file, line: line)
|
let logConstructor = LogConstructor(message: "__NOTHING__", tag: tag, level: logLevel, function: function, file: file, line: line)
|
||||||
|
|
||||||
switch errorResponse {
|
switch errorResponse {
|
||||||
case .error(-1, _, _, _):
|
case .error(-1, _, _, _):
|
||||||
networkError = .URLError(response: errorResponse, displayMessage: displayMessage, logConstructor: logConstructor)
|
networkError = .URLError(response: errorResponse, displayMessage: displayMessage, logConstructor: logConstructor)
|
||||||
|
@ -47,9 +47,9 @@ class ViewModel: ObservableObject {
|
||||||
// Able to use user-facing friendly description here since just HTTP status codes
|
// Able to use user-facing friendly description here since just HTTP status codes
|
||||||
LogManager.shared.log.error("Request failed: \(networkError.errorMessage.code) - \(networkError.errorMessage.title): \(networkError.errorMessage.logConstructor.message)\n\(error.localizedDescription)")
|
LogManager.shared.log.error("Request failed: \(networkError.errorMessage.code) - \(networkError.errorMessage.title): \(networkError.errorMessage.logConstructor.message)\n\(error.localizedDescription)")
|
||||||
}
|
}
|
||||||
|
|
||||||
self.errorMessage = networkError.errorMessage
|
self.errorMessage = networkError.errorMessage
|
||||||
|
|
||||||
networkError.logMessage()
|
networkError.logMessage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue