Add adavanced config and properties build for money
This commit is contained in:
parent
31760ee901
commit
faf80ba967
@ -26,7 +26,7 @@ object MoneyConfig {
|
|||||||
*/
|
*/
|
||||||
private var properties: MoneyConfigProperties? = null
|
private var properties: MoneyConfigProperties? = null
|
||||||
|
|
||||||
val propertiesBuilder = MoneyConfigProperties.MoneyConfigPropertiesBuilder()
|
private val propertiesBuilder = MoneyConfigProperties.MoneyConfigPropertiesBuilder()
|
||||||
|
|
||||||
private fun getProperties(): MoneyConfigProperties {
|
private fun getProperties(): MoneyConfigProperties {
|
||||||
return properties ?: propertiesBuilder.build()
|
return properties ?: propertiesBuilder.build()
|
||||||
@ -43,14 +43,16 @@ object MoneyConfig {
|
|||||||
* Value is money's value (Double)
|
* Value is money's value (Double)
|
||||||
*/
|
*/
|
||||||
fun parse(config: String, clearAllStates: Boolean = true) {
|
fun parse(config: String, clearAllStates: Boolean = true) {
|
||||||
|
// remove all states, if needed
|
||||||
if (clearAllStates) {
|
if (clearAllStates) {
|
||||||
MoneyConfig.config.clear()
|
MoneyConfig.config.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
val rates = config.split(getProperties().deliSplit)
|
val rates = config.split(getProperties().deliSplit)
|
||||||
rates.map { i ->
|
rates.map { i ->
|
||||||
val temp = i.split(getProperties().deliEqual)
|
val temp = i.split(getProperties().deliEqual)
|
||||||
if (temp.size == 2) {
|
if (temp.size == 2) {
|
||||||
val currency = temp[0].toUpperCase()
|
val currency = temp[0].toUpperCase().trim()
|
||||||
val value = temp[1].toDouble()
|
val value = temp[1].toDouble()
|
||||||
if (MoneyConfig.config.containsKey(currency)) {
|
if (MoneyConfig.config.containsKey(currency)) {
|
||||||
MoneyConfig.config.replace(currency, value)
|
MoneyConfig.config.replace(currency, value)
|
||||||
@ -63,6 +65,15 @@ object MoneyConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun appendRate(currency: String, rate: Double) = apply {
|
||||||
|
val currencyKey = currency.toUpperCase().trim()
|
||||||
|
if (config.containsKey(currencyKey)) {
|
||||||
|
config.replace(currencyKey, rate)
|
||||||
|
} else {
|
||||||
|
config[currencyKey] = rate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// all currencies with its rate
|
// all currencies with its rate
|
||||||
fun getConfig() = config
|
fun getConfig() = config
|
||||||
|
|
||||||
@ -97,4 +108,6 @@ object MoneyConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun builder() = MoneyConfigProperties.MoneyConfigPropertiesBuilder()
|
||||||
}
|
}
|
@ -4,4 +4,19 @@ fun StdMoney.exchangeTo(currency: StdMoney.Currency): StdMoney {
|
|||||||
return MoneyExchangeUtils.exchange(this, currency)
|
return MoneyExchangeUtils.exchange(this, currency)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun StdMoney.isMatchedCurrency(currency: StdMoney.Currency) = this.getMoneyCurrency().getCurrency().equals(currency.getCurrency(), ignoreCase = true)
|
fun StdMoney.isMatchedCurrency(currency: StdMoney.Currency) =
|
||||||
|
this.getMoneyCurrency().getCurrency().equals(currency.getCurrency(), ignoreCase = true)
|
||||||
|
|
||||||
|
inline fun buildMoneyConfigProperties(
|
||||||
|
builderAction: MoneyConfig.MoneyConfigProperties.MoneyConfigPropertiesBuilder.() -> Unit
|
||||||
|
): MoneyConfig.MoneyConfigProperties {
|
||||||
|
return MoneyConfig
|
||||||
|
.builder().apply(builderAction)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun applyMoneyConfig(
|
||||||
|
builderAction: MoneyConfig.() -> Unit,
|
||||||
|
) {
|
||||||
|
MoneyConfig.apply(builderAction)
|
||||||
|
}
|
@ -1,5 +0,0 @@
|
|||||||
package com.cubetiqs.money
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.FIELD)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
annotation class SpecialString(val value: String = "", val upperCase: Boolean = true, val trim: Boolean = true)
|
|
@ -1,37 +0,0 @@
|
|||||||
package com.cubetiqs.money
|
|
||||||
|
|
||||||
import java.lang.reflect.Field
|
|
||||||
|
|
||||||
class SpecialStringProcessor: ISerializer {
|
|
||||||
override fun <T> serialize(data: T?): T? {
|
|
||||||
if (data == null) return null
|
|
||||||
val clazz = data.javaClass
|
|
||||||
clazz.declaredFields.forEach {
|
|
||||||
it.isAccessible = true
|
|
||||||
if (it.isAnnotationPresent(SpecialString::class.java) && it.genericType == String::class.java) {
|
|
||||||
val annotationValues = it.getAnnotation(SpecialString::class.java)
|
|
||||||
var value = it.get(data).toString()
|
|
||||||
if (annotationValues.trim) {
|
|
||||||
value = value.trim()
|
|
||||||
}
|
|
||||||
if (annotationValues.upperCase) {
|
|
||||||
value = value.toUpperCase()
|
|
||||||
}
|
|
||||||
it.set(data, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSerializeKey(field: Field): String {
|
|
||||||
val annotationValue = field.getAnnotation(SpecialString::class.java).value
|
|
||||||
return if (annotationValue.isEmpty()) {
|
|
||||||
field.name
|
|
||||||
} else annotationValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ISerializer {
|
|
||||||
fun <T> serialize(data: T?): T?
|
|
||||||
}
|
|
@ -1,23 +1,28 @@
|
|||||||
import com.cubetiqs.money.Money
|
import com.cubetiqs.money.*
|
||||||
import com.cubetiqs.money.MoneyConfig
|
|
||||||
import com.cubetiqs.money.MoneyCurrency
|
|
||||||
import com.cubetiqs.money.MoneyExchangeUtils
|
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class MoneyTests {
|
class MoneyTests {
|
||||||
@Test
|
@Test
|
||||||
fun exchange_2usd_to_khr_test() {
|
fun exchange_2usd_to_khr_test() {
|
||||||
val properties = MoneyConfig
|
// val properties = MoneyConfig
|
||||||
.MoneyConfigProperties
|
// .MoneyConfigProperties
|
||||||
.MoneyConfigPropertiesBuilder()
|
// .MoneyConfigPropertiesBuilder()
|
||||||
.setDeliEqual(':')
|
// .setDeliEqual(':')
|
||||||
.setDeliSplit(',')
|
// .setDeliSplit(',')
|
||||||
.build()
|
// .build()
|
||||||
|
|
||||||
MoneyConfig
|
val properties = buildMoneyConfigProperties {
|
||||||
.setProperties(properties)
|
setDeliEqual(':')
|
||||||
.parse("USD:1,KHR:4000")
|
setDeliSplit(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
applyMoneyConfig {
|
||||||
|
setProperties(properties)
|
||||||
|
// parse("USD:1,KHR:4000")
|
||||||
|
appendRate("usd", 1.0)
|
||||||
|
appendRate("khr", 4000.0)
|
||||||
|
}
|
||||||
|
|
||||||
// Is valid for money config?
|
// Is valid for money config?
|
||||||
Assert.assertTrue(MoneyConfig.isValid())
|
Assert.assertTrue(MoneyConfig.isValid())
|
||||||
|
Loading…
Reference in New Issue
Block a user