From 3def8a44d132e540ff70fd3aeba479f858c42c48 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 13:53:32 +0600 Subject: [PATCH 1/6] #47 update moko-resources dependency --- errors/build.gradle.kts | 9 +++++++++ errors/src/androidMain/AndroidManifest.xml | 2 -- .../moko/errors/presenters/AlertDialogFragment.kt | 2 +- .../errors/handler/ExceptionHandlerContextImpl.kt | 9 +++++---- .../moko/errors/presenters/SnackBarErrorPresenter.kt | 2 +- gradle.properties | 8 +++----- gradle/libs.versions.toml | 12 ++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- sample/android-app/build.gradle.kts | 2 ++ sample/android-app/src/main/AndroidManifest.xml | 7 ++++--- sample/ios-app/Podfile.lock | 2 +- sample/mpp-library/build.gradle.kts | 4 ++++ .../mpp-library/src/androidMain/AndroidManifest.xml | 2 -- 13 files changed, 37 insertions(+), 26 deletions(-) delete mode 100755 errors/src/androidMain/AndroidManifest.xml delete mode 100755 sample/mpp-library/src/androidMain/AndroidManifest.xml diff --git a/errors/build.gradle.kts b/errors/build.gradle.kts index 236ea7e..718e0b8 100644 --- a/errors/build.gradle.kts +++ b/errors/build.gradle.kts @@ -2,6 +2,8 @@ * Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. */ +import dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask + plugins { id("dev.icerock.moko.gradle.multiplatform.mobile") id("kotlin-parcelize") @@ -14,6 +16,10 @@ plugins { group = "dev.icerock.moko" version = libs.versions.mokoErrorsVersion.get() +android { + namespace = "dev.icerock.moko.errors" +} + dependencies { commonMainImplementation(libs.coroutines) @@ -28,3 +34,6 @@ multiplatformResources { multiplatformResourcesPackage = "dev.icerock.moko.errors" } +tasks.withType().configureEach { + tasks.getByName("sourcesJar").dependsOn(this) +} diff --git a/errors/src/androidMain/AndroidManifest.xml b/errors/src/androidMain/AndroidManifest.xml deleted file mode 100755 index 2659015..0000000 --- a/errors/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/AlertDialogFragment.kt b/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/AlertDialogFragment.kt index a060158..c2a975b 100644 --- a/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/AlertDialogFragment.kt +++ b/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/AlertDialogFragment.kt @@ -28,7 +28,7 @@ class AlertDialogFragment : DialogFragment() { .setMessage(settings.messageText) .setPositiveButton(settings.positiveButtonText) { _, _ -> } .create() - } ?: throw IllegalStateException("Activity can't be null.") + } ?: error("Activity can't be null.") } @Parcelize diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerContextImpl.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerContextImpl.kt index d25c6b2..2ef32d8 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerContextImpl.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/handler/ExceptionHandlerContextImpl.kt @@ -39,13 +39,14 @@ internal class ExceptionHandlerContextImpl( override suspend fun execute(): HandlerResult { return try { HandlerResult.Success(block()) - } catch (e: Exception) { + } catch (e: CancellationException) { // Don't handle coroutines CancellationException - if (e is CancellationException) throw e + throw e + } catch (e: Exception) { onCatch?.invoke(e) - val isHandled = isHandledByCustomCatcher(e) + val isHandled: Boolean = isHandledByCustomCatcher(e) if (!isHandled) { // If not handled by a custom catcher - val errorValue = exceptionMapper(e) + val errorValue: T = exceptionMapper(e) eventsDispatcher.dispatchEvent { showError(e, errorValue) } diff --git a/errors/src/iosMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt b/errors/src/iosMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt index a14537b..b5d7cfd 100644 --- a/errors/src/iosMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt +++ b/errors/src/iosMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt @@ -4,9 +4,9 @@ package dev.icerock.moko.errors.presenters +import dev.icerock.moko.errors.MR import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.resources.desc.desc -import dev.icerock.moko.errors.MR /** * In iOS there is no such thing as snackbar, so it shows [AlertErrorPresenter]. diff --git a/gradle.properties b/gradle.properties index 5f1ef8f..f03601b 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,14 +3,12 @@ org.gradle.configureondemand=false org.gradle.parallel=true kotlin.code.style=official -kotlin.native.enableDependencyPropagation=false -kotlin.mpp.enableGranularSourceSetsMetadata=true -kotlin.mpp.enableCompatibilityMetadataVariant=true +kotlin.mpp.androidSourceSetLayoutVersion=2 android.useAndroidX=true -moko.android.targetSdk=30 -moko.android.compileSdk=30 +moko.android.targetSdk=33 +moko.android.compileSdk=33 moko.android.minSdk=16 moko.publish.name=MOKO errors diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e27e206..a748a23 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] -kotlinVersion = "1.6.10" +kotlinVersion = "1.8.10" androidAppCompatVersion = "1.2.0" materialDesignVersion = "1.4.0" androidLifecycleVersion = "2.1.0" androidCoreTestingVersion = "2.1.0" coroutinesVersion = "1.6.0-native-mt" -mokoMvvmVersion = "0.12.0" -mokoResourcesVersion = "0.18.0" -mokoErrorsVersion = "0.6.0" +mokoMvvmVersion = "0.16.0" +mokoResourcesVersion = "0.21.2" +mokoErrorsVersion = "0.7.0" [libraries] # android @@ -30,6 +30,6 @@ androidCoreTesting = { module = "androidx.arch.core:core-testing", version.ref = # gradle plugins kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinVersion" } -androidGradlePlugin = { module = "com.android.tools.build:gradle", version = "7.0.4" } +androidGradlePlugin = { module = "com.android.tools.build:gradle", version = "7.4.2" } mokoResourcesGradlePlugin = { module = "dev.icerock.moko:resources-generator", version.ref = "mokoResourcesVersion" } -mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.1.0" } +mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.3.0" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41dfb87..774fae8 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index 79c8280..2deed1e 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -11,6 +11,8 @@ plugins { android { buildFeatures.dataBinding = true + namespace = "com.icerockdev" + defaultConfig { applicationId = "dev.icerock.moko.samples.errors" diff --git a/sample/android-app/src/main/AndroidManifest.xml b/sample/android-app/src/main/AndroidManifest.xml index 5caf648..04f7539 100755 --- a/sample/android-app/src/main/AndroidManifest.xml +++ b/sample/android-app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -10,7 +9,9 @@ android:theme="@style/Theme.AppCompat.DayNight" tools:ignore="GoogleAppIndexingWarning"> - + diff --git a/sample/ios-app/Podfile.lock b/sample/ios-app/Podfile.lock index 4c4477d..de80add 100644 --- a/sample/ios-app/Podfile.lock +++ b/sample/ios-app/Podfile.lock @@ -13,4 +13,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: e8746dc30e9d53a96c59e8f821148cde03ea8c5b -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 25cffe1..f813b2b 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -13,6 +13,10 @@ plugins { id("dev.icerock.moko.gradle.detekt") } +android { + namespace = "com.icerockdev.library" +} + dependencies { commonMainImplementation(libs.coroutines) diff --git a/sample/mpp-library/src/androidMain/AndroidManifest.xml b/sample/mpp-library/src/androidMain/AndroidManifest.xml deleted file mode 100755 index 8f69414..0000000 --- a/sample/mpp-library/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - From a468feb0398763d3210986ba38201149d81ec096 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 15:38:07 +0600 Subject: [PATCH 2/6] #25 fallback factory implemented --- .../moko/errors/mappers/ConditionPair.kt | 10 -- .../errors/mappers/ExceptionMappersStorage.kt | 133 +++++++++++------- .../moko/errors/mappers/MappersContainer.kt | 10 ++ .../errors/mappers/ThrowableMapperItem.kt | 12 ++ 4 files changed, 102 insertions(+), 63 deletions(-) delete mode 100644 errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ConditionPair.kt create mode 100644 errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/MappersContainer.kt create mode 100644 errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ThrowableMapperItem.kt diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ConditionPair.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ConditionPair.kt deleted file mode 100644 index 1bdfea8..0000000 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ConditionPair.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.errors.mappers - -data class ConditionPair( - val condition: (Throwable) -> Boolean, - val mapper: ThrowableMapper -) diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt index 4c7fd8c..4dae278 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt @@ -10,20 +10,34 @@ import dev.icerock.moko.resources.desc.desc import kotlin.native.concurrent.ThreadLocal import kotlin.reflect.KClass -internal typealias ThrowableMapper = (Throwable) -> Any - @Suppress("TooManyFunctions") @ThreadLocal object ExceptionMappersStorage { - private val fallbackValuesMap: MutableMap, Any> = mutableMapOf( - StringDesc::class to MR.strings.moko_errors_unknownError.desc() + private val containers: MutableMap, MappersContainer<*>> = mutableMapOf( + StringDesc::class to MappersContainer( + mappers = emptyList(), + fallback = { MR.strings.moko_errors_unknownError.desc() } + ) ) - private val mappersMap: MutableMap, MutableMap, ThrowableMapper>> = - mutableMapOf() - private val conditionMappers: MutableMap, MutableList> = - mutableMapOf() + private fun getOrCreateContainer(resultClass: KClass): MappersContainer { + val existContainer: MappersContainer<*>? = containers[resultClass] + if (existContainer != null) return existContainer as MappersContainer + + return MappersContainer( + mappers = emptyList(), + fallback = { throw FallbackValueNotFoundException(resultClass) } + ).also { containers[resultClass] = it } + } + + private fun updateContainer( + resultClass: KClass, + block: (MappersContainer) -> MappersContainer + ) { + val container: MappersContainer = getOrCreateContainer(resultClass) + containers[resultClass] = block(container) + } /** * Register simple mapper (E) -> T. @@ -33,11 +47,16 @@ object ExceptionMappersStorage { exceptionClass: KClass, mapper: (E) -> T ): ExceptionMappersStorage { - if (!mappersMap.containsKey(resultClass)) { - mappersMap[resultClass] = mutableMapOf() + updateContainer( + resultClass + ) { container -> + container.copy( + mappers = container.mappers + ThrowableMapperItem( + mapper = { mapper(it as E) }, + isApplied = { it::class == exceptionClass } + ) + ) } - @Suppress("UNCHECKED_CAST") - mappersMap[resultClass]?.put(exceptionClass, mapper as ThrowableMapper) return this } @@ -46,12 +65,19 @@ object ExceptionMappersStorage { */ fun register( resultClass: KClass, - conditionPair: ConditionPair + isApplied: (Throwable) -> Boolean, + mapper: (Throwable) -> T ): ExceptionMappersStorage { - if (!conditionMappers.containsKey(resultClass)) { - conditionMappers[resultClass] = mutableListOf() + updateContainer( + resultClass + ) { container -> + container.copy( + mappers = container.mappers + ThrowableMapperItem( + mapper = mapper, + isApplied = isApplied + ) + ) } - conditionMappers[resultClass]?.add(conditionPair) return this } @@ -76,10 +102,8 @@ object ExceptionMappersStorage { noinline mapper: (Throwable) -> T ): ExceptionMappersStorage = register( resultClass = T::class, - conditionPair = ConditionPair( - condition, - mapper as ThrowableMapper - ) + isApplied = condition, + mapper = mapper ) /** @@ -91,20 +115,20 @@ object ExceptionMappersStorage { */ fun find( resultClass: KClass, - throwable: E, - exceptionClass: KClass + throwable: E ): ((E) -> T)? { - @Suppress("UNCHECKED_CAST") - val mapper = conditionMappers[resultClass] - ?.find { it.condition(throwable) } - ?.mapper as? ((E) -> T) - ?: mappersMap[resultClass]?.get(exceptionClass) as? ((E) -> T) + val container: MappersContainer? = containers[resultClass] as MappersContainer? - return if (mapper == null && throwable !is Exception) { + if (container == null && throwable !is Exception) { throw throwable - } else { - mapper + } else if (container == null) { + return null } + + return container.mappers + .firstOrNull { it.isApplied(throwable) } + ?.mapper + ?: container.fallback } /** @@ -116,16 +140,21 @@ object ExceptionMappersStorage { */ inline fun find(throwable: E): ((E) -> T)? = find( resultClass = T::class, - throwable = throwable, - exceptionClass = throwable::class + throwable = throwable ) /** * Sets fallback (default) value for [T] errors type. */ fun setFallbackValue(clazz: KClass, value: T): ExceptionMappersStorage { - fallbackValuesMap[clazz] = value - return ExceptionMappersStorage + updateContainer( + clazz + ) { container -> + container.copy( + fallback = { value } + ) + } + return this } /** @@ -135,37 +164,35 @@ object ExceptionMappersStorage { setFallbackValue(T::class, value) /** - * Returns fallback (default) value for [T] errors type. - * If there is no default value for the class [T], then [FallbackValueNotFoundException] - * exception will be thrown. + * Sets fallback (default) factory for [T] errors type. */ - fun getFallbackValue(clazz: KClass): T { - @Suppress("UNCHECKED_CAST") - return fallbackValuesMap[clazz] as? T - ?: throw FallbackValueNotFoundException(clazz) + fun setFallbackFactory( + clazz: KClass, + factory: (Throwable) -> T + ): ExceptionMappersStorage { + updateContainer( + clazz + ) { container -> + container.copy( + fallback = factory + ) + } + return this } - /** - * Returns fallback (default) value for [T] errors type. - * If there is no default value for the class [T], then [FallbackValueNotFoundException] - * exception will be thrown. - */ - inline fun getFallbackValue(): T = getFallbackValue(T::class) + inline fun setFallbackFactory( + noinline factory: (Throwable) -> T + ): ExceptionMappersStorage = setFallbackFactory(T::class, factory) /** * Factory method that creates mappers (Throwable) -> T with a registered fallback value for * class [T]. */ fun throwableMapper(clazz: KClass): (e: E) -> T { - val fallback = getFallbackValue(clazz) return { e -> - find(clazz, e, e::class)?.invoke(e) ?: fallback + find(clazz, e)?.invoke(e) ?: throw FallbackValueNotFoundException(clazz) } } - - inline fun throwableMapper(): (e: E) -> T { - return dev.icerock.moko.errors.mappers.throwableMapper() - } } /** diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/MappersContainer.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/MappersContainer.kt new file mode 100644 index 0000000..475f712 --- /dev/null +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/MappersContainer.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2023 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.errors.mappers + +internal data class MappersContainer( + val mappers: List>, + val fallback: ThrowableMapper +) diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ThrowableMapperItem.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ThrowableMapperItem.kt new file mode 100644 index 0000000..f93b456 --- /dev/null +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ThrowableMapperItem.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2023 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.errors.mappers + +internal typealias ThrowableMapper = (Throwable) -> T + +internal data class ThrowableMapperItem( + val mapper: ThrowableMapper, + val isApplied: (Throwable) -> Boolean +) From 6d5f2fc3adb7787c225a103995bee87dffe13733 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 15:40:32 +0600 Subject: [PATCH 3/6] #36 onEach notifier for exception storage mappers --- .../errors/mappers/ExceptionMappersStorage.kt | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt index 4dae278..cfc9b44 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt @@ -20,6 +20,7 @@ object ExceptionMappersStorage { fallback = { MR.strings.moko_errors_unknownError.desc() } ) ) + private val notifiers: MutableList<(Throwable, KClass<*>) -> Unit> = mutableListOf() private fun getOrCreateContainer(resultClass: KClass): MappersContainer { val existContainer: MappersContainer<*>? = containers[resultClass] @@ -125,10 +126,17 @@ object ExceptionMappersStorage { return null } - return container.mappers + val mapper: (Throwable) -> T = container.mappers .firstOrNull { it.isApplied(throwable) } ?.mapper ?: container.fallback + + return { exception -> + notifiers.forEach { notifier -> + notifier(exception, resultClass) + } + mapper(exception) + } } /** @@ -193,6 +201,18 @@ object ExceptionMappersStorage { find(clazz, e)?.invoke(e) ?: throw FallbackValueNotFoundException(clazz) } } + + /** + * Listen all mappers calls. Useful for logging + * + * @param block - lambda that will be called when exception map to some class + */ + fun onEach( + block: (Throwable, KClass<*>) -> Unit + ): ExceptionMappersStorage { + notifiers.add(block) + return this + } } /** From 3f2032e1973c526467334b4a1afcd3e87f823351 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 15:43:40 +0600 Subject: [PATCH 4/6] #36 improve onEach api --- .../moko/errors/mappers/ExceptionMappersStorage.kt | 9 +++++---- .../kotlin/com/icerockdev/library/ExceptionStorage.kt | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt index cfc9b44..08a4cd2 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt @@ -20,7 +20,7 @@ object ExceptionMappersStorage { fallback = { MR.strings.moko_errors_unknownError.desc() } ) ) - private val notifiers: MutableList<(Throwable, KClass<*>) -> Unit> = mutableListOf() + private val notifiers: MutableList<(Throwable, KClass<*>, Any) -> Unit> = mutableListOf() private fun getOrCreateContainer(resultClass: KClass): MappersContainer { val existContainer: MappersContainer<*>? = containers[resultClass] @@ -132,10 +132,11 @@ object ExceptionMappersStorage { ?: container.fallback return { exception -> + val result: T = mapper(exception) notifiers.forEach { notifier -> - notifier(exception, resultClass) + notifier(exception, resultClass, result) } - mapper(exception) + result } } @@ -208,7 +209,7 @@ object ExceptionMappersStorage { * @param block - lambda that will be called when exception map to some class */ fun onEach( - block: (Throwable, KClass<*>) -> Unit + block: (Throwable, KClass<*>, Any) -> Unit ): ExceptionMappersStorage { notifiers.add(block) return this diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/ExceptionStorage.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/ExceptionStorage.kt index 429e59c..39dd5ff 100644 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/ExceptionStorage.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/ExceptionStorage.kt @@ -14,4 +14,7 @@ fun initExceptionStorage() { .register { MR.strings.illegalArgumentText.desc() } + .onEach { throwable, kClass, result -> + println("$throwable mapped to $kClass with result $result") + } } From ec603c2e7b99129d788362691fe0f4659415d8e4 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 15:45:03 +0600 Subject: [PATCH 5/6] update android libs --- gradle/libs.versions.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a748a23..edbad45 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] kotlinVersion = "1.8.10" -androidAppCompatVersion = "1.2.0" -materialDesignVersion = "1.4.0" -androidLifecycleVersion = "2.1.0" -androidCoreTestingVersion = "2.1.0" -coroutinesVersion = "1.6.0-native-mt" +androidAppCompatVersion = "1.6.1" +materialDesignVersion = "1.8.0" +androidLifecycleVersion = "2.2.0" +androidCoreTestingVersion = "2.2.0" +coroutinesVersion = "1.6.4" mokoMvvmVersion = "0.16.0" mokoResourcesVersion = "0.21.2" mokoErrorsVersion = "0.7.0" From 7b431535559bdc051a2aa98e6936cc6906643fa0 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 16 Apr 2023 18:30:44 +0600 Subject: [PATCH 6/6] #25 rollback missed function --- .../icerock/moko/errors/mappers/ExceptionMappersStorage.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt index 08a4cd2..9eddb27 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt @@ -203,6 +203,10 @@ object ExceptionMappersStorage { } } + inline fun throwableMapper(): (e: E) -> T { + return dev.icerock.moko.errors.mappers.throwableMapper() + } + /** * Listen all mappers calls. Useful for logging *