tgoop.com/kotlin_lib/579
Last Update:
Konfeature — библиотека на Kotlin для работы с удалённой конфигурацией фич
Работа с удалённой конфигурацией стала стандартной частью процесса разработки почти любого приложения. В зависимости от сложности могут потребоваться:
* удобный синтаксис для объявления элементов конфигурации
* возможность разделять конфигурацию по разным файлам для разных фич
* возможность использовать локальную конфигурацию на этапе активной разработки фич
* поддержка нескольких источников данных для удалённой конфигурации
* возможность просматривать список всех конфигураций и изменять их значения в целях отладки
* логирование значения и его источника при обращении к конфигурации, а также не‐критичных ошибок
Мы постарались учесть все эти требования при разработке Konfeature.
Установка
repositories {
mavenCentral()
}
dependencies {
implementation("com.redmadrobot.konfeature:konfeature:<версия>")
}
Использование
FeatureConfig
Определяет набор элементов конфигурации с помощью делегатов:
*
by toggle(...)
— для Boolean
*
by value(...)
— для остальных типов
class ProfileFeatureConfig : FeatureConfig(
name = "profile_feature_config",
description = "Конфигурация фич для профиля"
) {
val isProfileFeatureEnabled: Boolean by toggle(
key = "profile_feature",
description = "показывать точку входа в профиль",
defaultValue = false,
)
val profileFeatureTitle: String by value(
key = "profile_feature_title",
description = "заголовок кнопки профиля",
defaultValue = "Feature number nine",
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
val profileButtonAppearDuration: Long by value(
key = "profile_button_appear_duration",
description = "длительность появления кнопки профиля в мс",
defaultValue = 200,
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
}
Регистрация конфигурации:
val profileFeatureConfig = ProfileFeatureConfig()
val konfeatureInstance = konfeature {
register(profileFeatureConfig)
}
FeatureSource
Абстракция источника значений:
interface FeatureSource {
val name: String
fun get(key: String): Any?
}
Пример для FirebaseRemoteConfig:
class FirebaseFeatureSource(
private val remoteConfig: FirebaseRemoteConfig
) : FeatureSource {
override val name: String = "FirebaseRemoteConfig"
override fun get(key: String): Any? {
return remoteConfig
.getValue(key)
.takeIf { source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE }
?.let { value ->
value.getOrNull { asBoolean() }
?: value.getOrNull { asString() }
?: value.getOrNull { asLong() }
?: value.getOrNull { asDouble() }
}
}
private fun FirebaseRemoteConfigValue.getOrNull(getter: FirebaseRemoteConfigValue.() -> Any?): Any? {
return try {
getter()
} catch (error: IllegalArgumentException) {
null
}
}
}
Добавление источника:
val konfeatureInstance = konfeature {
addSource(FirebaseFeatureSource(remoteConfig))
register(profileFeatureConfig)
}
SourceSelectionStrategy
Позволяет гибко выбирать, из каких источников запрашивать значение:
public interface SourceSelectionStrategy {
fun select(names: Set<String>): Set<String>
companion object {
val None: SourceSelectionStrategy = SourceSelectionStrategy { emptySet() }
val Any: SourceSelectionStrategy = SourceSelectionStrategy { it }
fun anyOf(vararg sources: String): SourceSelectionStrategy = SourceSelectionStrategy { sources.toSet() }
}
}
Предопределённые стратегии:
*
None
— всегда использовать только defaultValue
*
Any
— разрешает брать значения из любого источника*
anyOf("Source1", …)
— только из указанных источниковhttps://github.com/RedMadRobot/Konfeature
✍️ @kotlin_lib
BY Kotlin
Share with your friend now:
tgoop.com/kotlin_lib/579