diff --git a/Tusker/TimelineLikeController.swift b/Tusker/TimelineLikeController.swift index e64f5aa8..9eae8333 100644 --- a/Tusker/TimelineLikeController.swift +++ b/Tusker/TimelineLikeController.swift @@ -38,7 +38,10 @@ actor TimelineLikeController { private(set) var state = State.notLoadedInitial { willSet { - precondition(state.canTransition(to: newValue)) + guard state.canTransition(to: newValue) else { + logger.error("State \(self.state.debugDescription, privacy: .public) cannot transition to \(newValue.debugDescription, privacy: .public)") + preconditionFailure("cannot transition to state") + } logger.debug("State: \(self.state.debugDescription, privacy: .public) -> \(newValue.debugDescription, privacy: .public)") } } @@ -118,7 +121,10 @@ actor TimelineLikeController { } private func emit(event: Event) async { - precondition(state.canEmit(event: event)) + guard state.canEmit(event: event) else { + logger.error("State \(self.state.debugDescription, privacy: .public) cannot emit event: \(event.debugDescription, privacy: .public)") + preconditionFailure("state cannot emit event") + } switch event { case .addLoadingIndicator: await delegate.handleAddLoadingIndicator() @@ -227,7 +233,7 @@ actor TimelineLikeController { } } - enum Event { + enum Event: CustomDebugStringConvertible { case addLoadingIndicator case removeLoadingIndicator case loadAllError(Error, LoadAttemptToken) @@ -236,6 +242,27 @@ actor TimelineLikeController { case prependItems([Item], LoadAttemptToken) case loadOlderError(Error, LoadAttemptToken) case appendItems([Item], LoadAttemptToken) + + var debugDescription: String { + switch self { + case .addLoadingIndicator: + return "addLoadingIndicator" + case .removeLoadingIndicator: + return "removeLoadingIndicator" + case .loadAllError(let error, let token): + return "loadAllError(\(error), \(token))" + case .replaceAllItems(_, let token): + return "replcaeAllItems(, \(token))" + case .loadNewerError(let error, let token): + return "loadNewerError(\(error), \(token))" + case .prependItems(_, let token): + return "prependItems(, \(token))" + case .loadOlderError(let error, let token): + return "loadOlderError(\(error), \(token))" + case .appendItems(_, let token): + return "appendItems(, \(token))" + } + } } class LoadAttemptToken: Equatable {