From 180f47556281c172c52d6bae3902251290fe4ec7 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Thu, 7 Sep 2023 00:15:45 +0800 Subject: [PATCH] feat: add keyValuesRules function --- .../plugin/config/default/DefaultConfigs.kt | 10 ++++ .../factory/SweetPropertyConfigsFactory.kt | 8 +++ .../config/proxy/ISweetPropertyConfigs.kt | 4 ++ .../SweetPropertyConfigureExtension.kt | 49 +++++++++++++++++++ .../generator/factory/GeneratorFactory.kt | 3 ++ .../plugin/helper/PropertiesDeployHelper.kt | 4 +- 6 files changed, 77 insertions(+), 1 deletion(-) diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/default/DefaultConfigs.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/default/DefaultConfigs.kt index 0c9e0ef..890cdea 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/default/DefaultConfigs.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/default/DefaultConfigs.kt @@ -23,6 +23,7 @@ package com.highcapable.sweetproperty.plugin.config.default import com.highcapable.sweetproperty.plugin.config.proxy.ISweetPropertyConfigs import com.highcapable.sweetproperty.plugin.extension.dsl.configure.SweetPropertyConfigureExtension +import com.highcapable.sweetproperty.plugin.generator.factory.PropertyValueRule /** * 默认配置类实现类 @@ -78,6 +79,10 @@ internal object DefaultConfigs { get() = selfBase?.includeKeys ?: globalBase?.includeKeys ?: baseGenerateConfigs(name).includeKeys + override val keyValuesRules + get() = selfBase?.keyValuesRules + ?: globalBase?.keyValuesRules + ?: baseGenerateConfigs(name).keyValuesRules override val isEnableExcludeNonStringValue get() = selfBase?.isEnableExcludeNonStringValue ?: globalBase?.isEnableExcludeNonStringValue @@ -130,6 +135,10 @@ internal object DefaultConfigs { get() = selfBase?.includeKeys ?: globalBase?.includeKeys ?: baseGenerateConfigs(name).includeKeys + override val keyValuesRules + get() = selfBase?.keyValuesRules + ?: globalBase?.keyValuesRules + ?: baseGenerateConfigs(name).keyValuesRules override val isEnableExcludeNonStringValue get() = selfBase?.isEnableExcludeNonStringValue ?: globalBase?.isEnableExcludeNonStringValue @@ -160,6 +169,7 @@ internal object DefaultConfigs { override val permanentKeyValues get() = mutableMapOf() override val excludeKeys get() = mutableListOf() override val includeKeys get() = mutableListOf() + override val keyValuesRules get() = mutableMapOf() override val isEnableExcludeNonStringValue get() = true override val isEnableTypeAutoConversion get() = true override val isEnableValueInterpolation get() = true diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/factory/SweetPropertyConfigsFactory.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/factory/SweetPropertyConfigsFactory.kt index 6a7df2c..1f55b7e 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/factory/SweetPropertyConfigsFactory.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/factory/SweetPropertyConfigsFactory.kt @@ -108,6 +108,10 @@ private fun SweetPropertyConfigureExtension.SourcesCodeGenerateConfigureExtensio get() = this@create.includeKeys ?: global?.includeKeys ?: DefaultConfigs.sourcesCodeGenerateConfigs(name, selfBase, globalBase).includeKeys + override val keyValuesRules + get() = this@create.keyValuesRules + ?: global?.keyValuesRules + ?: DefaultConfigs.sourcesCodeGenerateConfigs(name, selfBase, globalBase).keyValuesRules override val isEnableExcludeNonStringValue get() = this@create.isEnableExcludeNonStringValue ?: selfBase?.isEnableExcludeNonStringValue @@ -175,6 +179,10 @@ private fun SweetPropertyConfigureExtension.BuildScriptGenerateConfigureExtensio get() = this@create.includeKeys ?: global?.includeKeys ?: DefaultConfigs.buildScriptGenerateConfigs(name, selfBase, globalBase).includeKeys + override val keyValuesRules + get() = this@create.keyValuesRules + ?: global?.keyValuesRules + ?: DefaultConfigs.buildScriptGenerateConfigs(name, selfBase, globalBase).keyValuesRules override val isEnableExcludeNonStringValue get() = this@create.isEnableExcludeNonStringValue ?: selfBase?.isEnableExcludeNonStringValue diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/proxy/ISweetPropertyConfigs.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/proxy/ISweetPropertyConfigs.kt index 26e455f..d3784a4 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/proxy/ISweetPropertyConfigs.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/config/proxy/ISweetPropertyConfigs.kt @@ -24,6 +24,7 @@ package com.highcapable.sweetproperty.plugin.config.proxy import com.highcapable.sweetproperty.SweetProperty import com.highcapable.sweetproperty.generated.SweetPropertyProperties import com.highcapable.sweetproperty.plugin.config.type.GenerateLocationType +import com.highcapable.sweetproperty.plugin.generator.factory.PropertyValueRule /** * [SweetProperty] 配置类接口类 @@ -132,6 +133,9 @@ internal interface ISweetPropertyConfigs { /** 被包含的属性键值名称数组 */ val includeKeys: MutableList + /** 属性键值规则数组 */ + val keyValuesRules: MutableMap + /** 是否启用排除非字符串类型键值内容 */ val isEnableExcludeNonStringValue: Boolean diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/extension/dsl/configure/SweetPropertyConfigureExtension.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/extension/dsl/configure/SweetPropertyConfigureExtension.kt index 76a92c4..c800266 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/extension/dsl/configure/SweetPropertyConfigureExtension.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/extension/dsl/configure/SweetPropertyConfigureExtension.kt @@ -28,6 +28,7 @@ import com.highcapable.sweetproperty.gradle.factory.isUnSafeExtName import com.highcapable.sweetproperty.plugin.config.factory.create import com.highcapable.sweetproperty.plugin.config.proxy.ISweetPropertyConfigs import com.highcapable.sweetproperty.plugin.config.type.GenerateLocationType +import com.highcapable.sweetproperty.plugin.generator.factory.PropertyValueRule import com.highcapable.sweetproperty.utils.debug.SError import com.highcapable.sweetproperty.utils.noEmpty import org.gradle.api.Action @@ -212,6 +213,9 @@ open class SweetPropertyConfigureExtension internal constructor() { /** 当前被包含的属性键值名称数组 */ internal var includeKeys: MutableList? = null + /** 当前属性键值规则数组 */ + internal var keyValuesRules: MutableMap? = null + /** 当前生成位置类型数组 */ internal var generateLocationTypes: Array? = null @@ -355,6 +359,51 @@ open class SweetPropertyConfigureExtension internal constructor() { includeKeys = keys.distinct().toMutableList() } + /** + * 设置属性键值规则数组 + * + * 你可以设置一组键值规则 - 使用 [createValueRule] 创建新的规则 - 用于解析得到的键值内容 + * + * 示例如下 ↓ + * + * ```kotlin + * keyValuesRules( + * "some.key1" to createValueRule { if (it.contains("_")) it.replace("_", "-") else it }, + * "some.key2" to createValueRule { "$it-value" } + * ) + * ``` + * + * 这些键值规则在属性键值存在它们时被应用 + * @param pairs 属性键值规则数组 + */ + @JvmName("-kotlin-dsl-only-keyValuesRules-") + fun keyValuesRules(vararg pairs: Pair) { + if (pairs.isEmpty()) SError.make("Key-values rules must not be empty") + if (pairs.any { it.first.isBlank() }) SError.make("Key-values rules must not have blank contents") + keyValuesRules = mutableMapOf(*pairs) + } + + /** + * 设置属性键值规则数组 (Groovy 兼容方法) + * + * 你可以设置一组键值规则 - 使用 [createValueRule] 创建新的规则 - 用于解析得到的键值内容 + * + * 这些键值规则在属性键值存在它们时被应用 + * @param rules 属性键值规则数组 + */ + fun keyValuesRules(rules: Map) { + if (rules.isEmpty()) SError.make("Key-values rules must not be empty") + if (rules.any { it.key.isBlank() }) SError.make("Key-values rules must not have blank contents") + keyValuesRules = rules.toMutableMap() + } + + /** + * 创建新的属性键值规则 + * @param rule 回调当前规则 + * @return [PropertyValueRule] + */ + fun createValueRule(rule: PropertyValueRule) = rule + /** * 设置从何处生成属性键值 * diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/generator/factory/GeneratorFactory.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/generator/factory/GeneratorFactory.kt index cfc0774..65b2f67 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/generator/factory/GeneratorFactory.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/generator/factory/GeneratorFactory.kt @@ -26,6 +26,9 @@ import kotlin.reflect.KClass /** 属性键值数组类型定义 */ internal typealias PropertyMap = MutableMap +/** 属性键值规则类型定义 */ +internal typealias PropertyValueRule = (value: String) -> String + /** * 解析到键值内容类型 * @param isAutoConversion 是否自动转换类型 diff --git a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/helper/PropertiesDeployHelper.kt b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/helper/PropertiesDeployHelper.kt index 19d0223..0bd8bc8 100644 --- a/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/helper/PropertiesDeployHelper.kt +++ b/sweetproperty-gradle-plugin/src/main/java/com/highcapable/sweetproperty/plugin/helper/PropertiesDeployHelper.kt @@ -283,7 +283,7 @@ internal object PropertiesDeployHelper { } } ?: true }.toMutableMap().also { resolveKeyValues -> - resolveKeyValues.forEach { (key, value) -> + resolveKeyValues.onEach { (key, value) -> val resolveKeys = mutableListOf() /** @@ -298,6 +298,8 @@ internal object PropertiesDeployHelper { else resolveValue } if (value.hasInterpolation()) resolveKeyValues[key] = value.resolveValue() + }.takeIf { configs.keyValuesRules.isNotEmpty() }?.forEach { (key, value) -> + configs.keyValuesRules[key]?.also { resolveKeyValues[key] = it(value) } }; propteries.putAll(resolveKeyValues) } }; return propteries