diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt index a5f33c5..f1d2722 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt @@ -15,24 +15,35 @@ sealed class ApiException(message: String) : Throwable(message) { data object UnknownException: ApiException("Unknown exception") } -class ErrorLogger { +interface Logger { + fun log(response: NetworkResponse<*, E>) + fun dumpLog() +} + +interface ErrorDumper { + fun dump(): List> +} - val errors = mutableListOf>() +class ErrorLogger: Logger, ErrorDumper { - fun log(response: NetworkResponse<*, E>) { + private val errors = mutableListOf>() + + override fun log(response: NetworkResponse<*, E>) { if (response is Failure) { errors.add(response.responseDateTime to response.error) } } - fun dumpLog() { + override fun dumpLog() { errors.forEach { (date, error) -> println("Error at $date: ${error.message}") } } + + override fun dump(): List> = errors.toList() } -fun processThrowables(logger: ErrorLogger) { +fun processThrowables(logger: Logger) { logger.log(Success("Success")) Thread.sleep(100) logger.log(Success(Circle)) @@ -42,16 +53,25 @@ fun processThrowables(logger: ErrorLogger) { logger.dumpLog() } -fun processApiErrors(apiExceptionLogger: ErrorLogger) { +fun processApiErrors(apiExceptionLogger: Logger) { apiExceptionLogger.log(Success("Success")) Thread.sleep(100) apiExceptionLogger.log(Success(Circle)) Thread.sleep(100) - apiExceptionLogger.log(Failure(ApiException.NetworkException)) + + val f = Failure(ApiException.NetworkException) + apiExceptionLogger.log(f) apiExceptionLogger.dumpLog() } +fun dumpErrors(logger: ErrorDumper) { + logger.dump().forEach { (date, error) -> + println("Error at $date: ${error.message}") + } +} + + fun main() { val logger = ErrorLogger() @@ -60,5 +80,8 @@ fun main() { println("Processing Api:") processApiErrors(logger) + + println("Dump all errors:") + dumpErrors(logger) } diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt index 3018c40..9af86c2 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt @@ -9,19 +9,19 @@ import java.time.LocalDateTime /** * Network result */ -sealed class NetworkResponse { +sealed class NetworkResponse { val responseDateTime: LocalDateTime = LocalDateTime.now() } /** * Network success */ -data class Success(val resp: T): NetworkResponse() +data class Success(val resp: T): NetworkResponse() /** * Network error */ -data class Failure(val error: R): NetworkResponse() +data class Failure(val error: R): NetworkResponse() val s1 = Success("Message") val r11: NetworkResponse = s1