@@ -3,14 +3,19 @@ package org.utbot.common
3
3
import java.io.FileInputStream
4
4
import java.io.IOException
5
5
import java.util.*
6
+ import kotlin.Comparator
6
7
import mu.KLogger
7
8
import org.utbot.common.PathUtil.toPath
8
9
import kotlin.properties.PropertyDelegateProvider
9
10
import kotlin.properties.ReadWriteProperty
10
11
import kotlin.reflect.KProperty
11
12
12
13
interface SettingsContainer {
13
- fun <T > settingFor (defaultValue : T , converter : (String ) -> T ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >>
14
+ fun <T > settingFor (
15
+ defaultValue : T ,
16
+ range : Triple <T , T , Comparator <T >>? = null,
17
+ converter : (String ) -> T
18
+ ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >>
14
19
15
20
// Returns true iff some properties have non-default values
16
21
fun isCustomized () = false
@@ -73,19 +78,25 @@ class PropertiesSettingsContainer(
73
78
74
79
override fun <T > settingFor (
75
80
defaultValue : T ,
81
+ range : Triple <T , T , Comparator <T >>? ,
76
82
converter : (String ) -> T
77
83
): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> {
78
84
return PropertyDelegateProvider { _, property ->
79
85
SettingDelegate (property) {
80
86
try {
81
87
properties.getProperty(property.name)?.let {
82
- val parsedValue = converter.invoke(it)
88
+ var parsedValue = converter.invoke(it)
89
+ range?.let {
90
+ // Coerce parsed value into the specified range
91
+ parsedValue = maxOf(parsedValue, range.first, range.third)
92
+ parsedValue = minOf(parsedValue, range.second, range.third)
93
+ }
83
94
customized = customized or (parsedValue != defaultValue)
84
95
return @SettingDelegate parsedValue
85
96
}
86
97
defaultValue
87
98
} catch (e: Throwable ) {
88
- logger.info(e ) { e.message }
99
+ logger.warn( " Cannot parse value for ${property.name} , default value [ $defaultValue ] will be used instead " ) { e }
89
100
defaultValue
90
101
}
91
102
}
@@ -130,16 +141,26 @@ abstract class AbstractSettings(
130
141
131
142
fun areCustomized (): Boolean = container.isCustomized()
132
143
144
+ protected fun <T > getProperty (
145
+ defaultValue : T ,
146
+ range : Triple <T , T , Comparator <T >>? ,
147
+ converter : (String ) -> T
148
+ ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> where T : Comparable <T > {
149
+ return container.settingFor(defaultValue, range, converter)
150
+ }
151
+
133
152
protected fun <T > getProperty (
134
153
defaultValue : T ,
135
154
converter : (String ) -> T
136
155
): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> {
137
- return container.settingFor(defaultValue, converter)
156
+ return container.settingFor(defaultValue, null , converter)
138
157
}
139
158
140
- protected fun getBooleanProperty (defaultValue : Boolean ) = getProperty(defaultValue, String ::toBoolean)
141
- protected fun getIntProperty (defaultValue : Int ) = getProperty(defaultValue, String ::toInt)
142
- protected fun getLongProperty (defaultValue : Long ) = getProperty(defaultValue, String ::toLong)
159
+ protected fun getBooleanProperty (defaultValue : Boolean ) = getProperty(defaultValue, converter = String ::toBoolean)
160
+ protected fun getIntProperty (defaultValue : Int ) = getProperty(defaultValue, converter = String ::toInt)
161
+ protected fun getIntProperty (defaultValue : Int , minValue : Int , maxValue : Int ) = getProperty(defaultValue, Triple (minValue, maxValue, Comparator (Integer ::compare)), String ::toInt)
162
+ protected fun getLongProperty (defaultValue : Long ) = getProperty(defaultValue, converter = String ::toLong)
163
+ protected fun getLongProperty (defaultValue : Long , minValue : Long , maxValue : Long ) = getProperty(defaultValue, Triple (minValue, maxValue, Comparator (Long ::compareTo)), String ::toLong)
143
164
protected fun getStringProperty (defaultValue : String ) = getProperty(defaultValue) { it }
144
165
protected inline fun <reified T : Enum <T >> getEnumProperty (defaultValue : T ) =
145
166
getProperty(defaultValue) { enumValueOf(it) }
0 commit comments