@@ -42,7 +42,7 @@ object Conditions {
4242 EQUALS -> attributeValue.value == conditionValue.value
4343 NOT_EQUALS -> attributeValue.value != conditionValue.value
4444 CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty()) ? : false
45- NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty())?.not () ? : false
45+ NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty())?.not () ? : false
4646 STARTS_WITH -> attributeValue.value?.startsWith(conditionValue.value.orEmpty()) ? : false
4747 ENDS_WITH -> attributeValue.value?.endsWith(conditionValue.value.orEmpty()) ? : false
4848 SEMVER_EQUALS -> compareVersions(
@@ -119,6 +119,65 @@ object Conditions {
119119 }
120120 }
121121
122+ attributeValue is AttributeValue .IntValue && conditionValue is ConditionValue .ArrayValue -> {
123+ when (operator ) {
124+ IN_ARRAY -> attributeValue.value.toString() in conditionValue.values
125+ NOT_IN_ARRAY -> (attributeValue.value.toString() !in conditionValue.values)
126+ else -> false
127+ }
128+ }
129+
130+ attributeValue is AttributeValue .DoubleValue && conditionValue is ConditionValue .StringValue -> {
131+ when (operator ) {
132+ EQUALS -> attributeValue.value.toString() == conditionValue.value
133+ NOT_EQUALS -> attributeValue.value.toString() != conditionValue.value
134+
135+ SEMVER_EQUALS -> compareVersions(
136+ attributeValue.value.toString(),
137+ conditionValue.value.orEmpty(),
138+ ) == 0
139+
140+ SEMVER_NOT_EQUALS -> compareVersions(
141+ attributeValue.value.toString(),
142+ conditionValue.value.orEmpty(),
143+ ) != 0
144+
145+ SEMVER_GREATER_THAN -> compareVersions(
146+ attributeValue.value.toString(),
147+ conditionValue.value.orEmpty()
148+ ) == 1
149+
150+ SEMVER_GREATER_THAN_OR_EQUALS -> compareVersions(
151+ attributeValue.value.toString(),
152+ conditionValue.value.orEmpty()
153+ ) >= 0
154+
155+ SEMVER_LESS_THAN -> compareVersions(
156+ attributeValue.value.toString(),
157+ conditionValue.value.orEmpty()
158+ ) == - 1
159+
160+ SEMVER_LESS_THAN_OR_EQUALS -> compareVersions(
161+ attributeValue.value.toString(),
162+ conditionValue.value.orEmpty()
163+ ) <= 0
164+
165+ else -> false
166+ }
167+ }
168+
169+ attributeValue is AttributeValue .StringValue && conditionValue is ConditionValue .IntValue -> {
170+ when (operator ) {
171+ EQUALS -> attributeValue.value == conditionValue.value.toString()
172+ NOT_EQUALS -> attributeValue.value != conditionValue.value.toString()
173+ CONTAINS -> attributeValue.value?.contains(conditionValue.value.toString()) ? : false
174+ NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.toString())?.not () ? : false
175+ STARTS_WITH -> attributeValue.value?.startsWith(conditionValue.value.toString()) ? : false
176+ ENDS_WITH -> attributeValue.value?.endsWith(conditionValue.value.toString()) ? : false
177+ else -> false
178+ }
179+ }
180+
122181 attributeValue is AttributeValue .DateValue && conditionValue is ConditionValue .DateTimeValue -> {
123182 when (operator ) {
124183 EQUALS -> attributeValue.value == conditionValue.value
@@ -143,9 +202,35 @@ object Conditions {
143202
144203 private fun compareVersions (actual : String , condition : String ): Int {
145204 return try {
146- SemVer .parse(actual).compareTo(SemVer .parse(condition))
205+ SemVer .parse(normalizeSemver( actual)) .compareTo(SemVer .parse(normalizeSemver( condition) ))
147206 } catch (e: Exception ) {
148207 0
149208 }
150209 }
210+
211+ private fun normalizeSemver (version : String ): String {
212+ val parts = version.split(" -" , " +" )
213+ val mainParts = parts[0 ].split(" ." )
214+
215+ val normalizedMainParts = mainParts.take(3 ).mapIndexed { _, part ->
216+ val num = part.toIntOrNull() ? : 0
217+ num.coerceAtMost(999 ).toString()
218+ }
219+
220+ var normalizedVersion = normalizedMainParts.joinToString(" ." )
221+
222+ if (parts.size > 1 && parts[1 ].isNotEmpty()) {
223+ val preRelease = parts[1 ].split(" ." ).joinToString(" ." ) {
224+ it
225+ }
226+ normalizedVersion + = " -$preRelease "
227+ }
228+
229+ if (parts.size > 2 && parts[2 ].isNotEmpty()) {
230+ val buildMetadata = parts[2 ]
231+ normalizedVersion + = " +$buildMetadata "
232+ }
233+
234+ return normalizedVersion
235+ }
151236}
0 commit comments