@@ -3,14 +3,19 @@ package org.utbot.common
33import java.io.FileInputStream
44import java.io.IOException
55import java.util.*
6+ import kotlin.Comparator
67import mu.KLogger
78import org.utbot.common.PathUtil.toPath
89import kotlin.properties.PropertyDelegateProvider
910import kotlin.properties.ReadWriteProperty
1011import kotlin.reflect.KProperty
1112
1213interface 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 >>
1419
1520 // Returns true iff some properties have non-default values
1621 fun isCustomized () = false
@@ -73,19 +78,25 @@ class PropertiesSettingsContainer(
7378
7479 override fun <T > settingFor (
7580 defaultValue : T ,
81+ range : Triple <T , T , Comparator <T >>? ,
7682 converter : (String ) -> T
7783 ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> {
7884 return PropertyDelegateProvider { _, property ->
7985 SettingDelegate (property) {
8086 try {
8187 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+ }
8394 customized = customized or (parsedValue != defaultValue)
8495 return @SettingDelegate parsedValue
8596 }
8697 defaultValue
8798 } 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 }
89100 defaultValue
90101 }
91102 }
@@ -130,16 +141,26 @@ abstract class AbstractSettings(
130141
131142 fun areCustomized (): Boolean = container.isCustomized()
132143
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+
133152 protected fun <T > getProperty (
134153 defaultValue : T ,
135154 converter : (String ) -> T
136155 ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> {
137- return container.settingFor(defaultValue, converter)
156+ return container.settingFor(defaultValue, null , converter)
138157 }
139158
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)
143164 protected fun getStringProperty (defaultValue : String ) = getProperty(defaultValue) { it }
144165 protected inline fun <reified T : Enum <T >> getEnumProperty (defaultValue : T ) =
145166 getProperty(defaultValue) { enumValueOf(it) }
0 commit comments