1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.intentresolver.validation.types 17 18 import com.android.intentresolver.validation.Importance 19 import com.android.intentresolver.validation.Invalid 20 import com.android.intentresolver.validation.NoValue 21 import com.android.intentresolver.validation.Valid 22 import com.android.intentresolver.validation.ValidationResult 23 import com.android.intentresolver.validation.Validator 24 import com.android.intentresolver.validation.ValueIsWrongType 25 import kotlin.reflect.KClass 26 import kotlin.reflect.cast 27 28 class SimpleValue<T : Any>( 29 override val key: String, 30 private val expected: KClass<T>, 31 ) : Validator<T> { 32 validatenull33 override fun validate(source: (String) -> Any?, importance: Importance): ValidationResult<T> { 34 val value: Any? = source(key) 35 return when { 36 // The value is present and of the expected type. 37 expected.isInstance(value) -> return Valid(expected.cast(value)) 38 39 // No value is present. 40 value == null -> 41 when (importance) { 42 Importance.WARNING -> Invalid() // No warnings if optional, but missing 43 Importance.CRITICAL -> Invalid(NoValue(key, importance, expected)) 44 } 45 46 // The value is some other type. 47 else -> 48 Invalid( 49 listOf( 50 ValueIsWrongType( 51 key, 52 importance, 53 actualType = value::class, 54 allowedTypes = listOf(expected) 55 ) 56 ) 57 ) 58 } 59 } 60 } 61