DivKit Expression DSL
Основные понятия
- Expression
— базовый тип выражения с результатом T. - build(): String — строит «внутреннее» выражение DivKit без оболочки "@{…}".
- compile(): String — оборачивает в "@{…}" для сериализации в JSON.
- Типы выражений:
- Литералы типов
integer,number,stringиboolean. - Переменные
Var<T>, создаются из строки-имени. - Арифметические операции: унарный минус
-, сложение+, вычитание-, умножение*, деление/, остаток от деления% - Логические операции: отрицание
!, логическое иand, логическое илиor. - Сравнение: равенство
equalTo, неравенствоnotEqualTo, большеmoreThan, меньшеlessThan, больше или равноmoreThanOrEqualTo, меньше или равноlessThanOrEqualTo. - Конкатенация строк
+. - Тернарный оператор
ifElse. - Try-оператор
tryExpression. - Вызов функции
functionName(args...).
- Литералы типов
- Скобки и экранирование:
- Вложенные инфиксные выражения, тернарные и literal-вставки автоматически заключаются в скобки при необходимости.
- Строковые литералы берутся в одинарные кавычки; апостроф экранируется как '.
- Для number всегда есть десятичная точка (например, 1 → 1.0).
- Отрицательные числа печатаются как (-1), (-2.5).
Важно: не вызывайте compile() внутри других build’ов — это сломает экранирование строк.
Литералы
Целые числа
val one: Expression<Long> = 1.integer()val one: Expression<Long> = 1L.integer()
Числа с плавающей точкой
val one: Expression<Double> = 1.number()val one: Expression<Double> = 1L.number()val one: Expression<Double> = 1.0f.number()val one: Expression<Double> = 1.0.number()
Важно: десятичная точка всегда сохраняется (например, 1 → 1.0).
Строки
val text: Expression<String> = "text".string()
Экранирование: "O'Reilly".string() даст результат "'O\'Reilly'"
Логический тип
val isTrue: Expression<String> = true.boolean()val isFalse: Expression<String> = false.boolean()
Использование готового выражения
val expr = "1 + 2".literalExpression<Long>()
Переменные
Обращение к переменной:
val exprVariable: Var<Boolean> = "variable_name".booleanVariable()val exprVariable: Var<String> = "variable_name".stringVariable()val exprVariable: Var<Double> = "variable_name".numberVariable()val exprVariable: Var<Long> = "variable_name".integerVariable()val exprVariable: Var<Url> = "variable_name".urlVariable()val exprVariable>(): Var<Map<String, Any>> = "variable_name".dictVariable<Any>()val exprVariable: Var<Long> = "variable_name".datetimeVariable()val exprVariable>(): Var<List<Any>> = "variable_name".arrayVariable<Any>()val exprVariable: Var<String> = "variable_name".colorVariable()
Арифметические операции
Включает префиксный унарный минус, числовые операции и конкатенацию строк.
Префиксный унарный минус
operator fun Expression<Long>.unaryMinus(): Expression<Long>
Пример:
val count = "count".integerVariable()
val result = -count
operator fun Expression<Double>.unaryMinus(): Expression<Double>
Пример:
val amount = "amount".numberVariable()
val result = -amount
Сложение
operator fun Expression<Long>.plus(other: Expression<Long>): Expression<Long>
Варианты перегрузки:
operator fun Expression<Long>.plus(other: Int): Expression<Long>operator fun Expression<Long>.plus(other: Long): Expression<Long>operator fun Int.plus(other: Expression<Long>): Expression<Long>operator fun Long.plus(other: Expression<Long>): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a + b
operator fun Expression<Double>.plus(other: Expression<Double>): Expression<Double>
Варианты перегрузки:
operator fun Expression<Double>.plus(other: Double): Expression<Double>operator fun Expression<Double>.plus(other: Float): Expression<Double>operator fun Expression<Double>.plus(other: Int): Expression<Double>operator fun Expression<Double>.plus(other: Long): Expression<Double>operator fun Double.plus(other: Expression<Double>): Expression<Double>operator fun Float.plus(other: Expression<Double>): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a + b
Вычитание
operator fun Expression<Long>.minus(other: Expression<Long>): Expression<Long>
Варианты перегрузки:
operator fun Expression<Long>.minus(other: Int): Expression<Long>operator fun Expression<Long>.minus(other: Long): Expression<Long>operator fun Int.minus(other: Expression<Long>): Expression<Long>operator fun Long.minus(other: Expression<Long>): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a - b
operator fun Expression<Double>.minus(other: Expression<Double>): Expression<Double>
Варианты перегрузки:
operator fun Expression<Double>.minus(other: Double): Expression<Double>operator fun Expression<Double>.minus(other: Float): Expression<Double>operator fun Expression<Double>.minus(other: Int): Expression<Double>operator fun Expression<Double>.minus(other: Long): Expression<Double>operator fun Double.minus(other: Expression<Double>): Expression<Double>operator fun Float.minus(other: Expression<Double>): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a - b
Умножение
operator fun Expression<Long>.times(other: Expression<Long>): Expression<Long>
Варианты перегрузки:
operator fun Expression<Long>.times(other: Int): Expression<Long>operator fun Expression<Long>.times(other: Long): Expression<Long>operator fun Int.times(other: Expression<Long>): Expression<Long>operator fun Long.times(other: Expression<Long>): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a * b
operator fun Expression<Double>.times(other: Expression<Double>): Expression<Double>
Варианты перегрузки:
operator fun Expression<Double>.times(other: Double): Expression<Double>operator fun Expression<Double>.times(other: Float): Expression<Double>operator fun Expression<Double>.times(other: Int): Expression<Double>operator fun Expression<Double>.times(other: Long): Expression<Double>operator fun Double.times(other: Expression<Double>): Expression<Double>operator fun Float.times(other: Expression<Double>): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a * b
Деление
operator fun Expression<Long>.div(other: Expression<Long>): Expression<Long>
Варианты перегрузки:
operator fun Expression<Long>.div(other: Int): Expression<Long>operator fun Expression<Long>.div(other: Long): Expression<Long>operator fun Int.div(other: Expression<Long>): Expression<Long>operator fun Long.div(other: Expression<Long>): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a / b
operator fun Expression<Double>.div(other: Expression<Double>): Expression<Double>
Варианты перегрузки:
operator fun Expression<Double>.div(other: Double): Expression<Double>operator fun Expression<Double>.div(other: Float): Expression<Double>operator fun Expression<Double>.div(other: Int): Expression<Double>operator fun Expression<Double>.div(other: Long): Expression<Double>operator fun Double.div(other: Expression<Double>): Expression<Double>operator fun Float.div(other: Expression<Double>): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a / b
Остаток от целочисленного деления
operator fun Expression<Long>.rem(other: Expression<Long>): Expression<Long>
Варианты перегрузки:
operator fun Expression<Long>.rem(other: Int): Expression<Long>operator fun Expression<Long>.rem(other: Long): Expression<Long>operator fun Int.rem(other: Expression<Long>): Expression<Long>operator fun Long.rem(other: Expression<Long>): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a % b
operator fun Expression<Double>.rem(other: Expression<Double>): Expression<Double>
Варианты перегрузки:
operator fun Expression<Double>.rem(other: Double): Expression<Double>operator fun Expression<Double>.rem(other: Float): Expression<Double>operator fun Expression<Double>.rem(other: Int): Expression<Double>operator fun Expression<Double>.rem(other: Long): Expression<Double>operator fun Double.rem(other: Expression<Double>): Expression<Double>operator fun Float.rem(other: Expression<Double>): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a % b
Конкатенация строк
operator fun Expression<String>.plus(other: Expression<String>): Expression<String>
Пример:
val hello = "Hello, ".string()
val username = "username".stringVariable()
val result = hello + username
Логический операции
Префиксное отрицание
operator fun Expression<Boolean>.not(): Expression<Boolean>
Пример:
val flag = "flag".booleanVariable()
val result = !flag
Логическое И
infix fun Expression<Boolean>.and(other: Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Boolean>.and(other: Boolean): Expression<Boolean>infix fun Boolean.and(other: Expression<Boolean>): Expression<Boolean>
Пример:
val a = "a".booleanVariable()
val b = "b".booleanVariable()
val result = a and b
Логическое ИЛИ
infix fun Expression<Boolean>.or(other: Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Boolean>.or(other: Boolean): Expression<Boolean>infix fun Boolean.or(other: Expression<Boolean>): Expression<Boolean>
Пример:
val a = "a".booleanVariable()
val b = "b".booleanVariable()
val result = a or b
Операции сравнения
Равенство
infix fun Expression<Long>.equalTo(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.equalTo(other: Int): Expression<Boolean>infix fun Expression<Long>.equalTo(other: Long): Expression<Boolean>infix fun Int.equalTo(other: Expression<Long>): Expression<Boolean>infix fun Long.equalTo(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a equalTo b
infix fun Expression<Double>.equalTo(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.equalTo(other: Double): Expression<Boolean>infix fun Expression<Double>.equalTo(other: Float): Expression<Boolean>infix fun Expression<Double>.equalTo(other: Int): Expression<Boolean>infix fun Expression<Double>.equalTo(other: Long): Expression<Boolean>infix fun Double.equalTo(other: Expression<Double>): Expression<Boolean>infix fun Float.equalTo(other: Expression<Double>): Expression<Boolean>infix fun Int.equalTo(other: Expression<Double>): Expression<Boolean>infix fun Long.equalTo(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a equalTo b
infix fun Expression<String>.equalTo(other: Expression<String>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<String>.equalTo(other: String): Expression<Boolean>infix fun String.equalTo(other: Expression<String>): Expression<Boolean>
Пример:
val a = "a".stringVariable()
val b = "b".stringVariable()
val result = a equalTo b
infix fun Expression<Boolean>.equalTo(other: Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Boolean>.equalTo(other: Boolean): Expression<Boolean>infix fun Boolean.equalTo(other: Expression<Boolean>): Expression<Boolean>
Пример:
val a = "a".booleanVariable()
val b = "b".booleanVariable()
val result = a equalTo b
Неравенство
infix fun Expression<Long>.notEqualTo(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.notEqualTo(other: Int): Expression<Boolean>infix fun Expression<Long>.notEqualTo(other: Long): Expression<Boolean>infix fun Int.notEqualTo(other: Expression<Long>): Expression<Boolean>infix fun Long.notEqualTo(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a notEqualTo b
infix fun Expression<Double>.notEqualTo(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.notEqualTo(other: Double): Expression<Boolean>infix fun Expression<Double>.notEqualTo(other: Float): Expression<Boolean>infix fun Expression<Double>.notEqualTo(other: Int): Expression<Boolean>infix fun Expression<Double>.notEqualTo(other: Long): Expression<Boolean>infix fun Double.notEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Float.notEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Int.notEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Long.notEqualTo(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a notEqualTo b
infix fun Expression<String>.notEqualTo(other: Expression<String>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<String>.notEqualTo(other: String): Expression<Boolean>infix fun String.notEqualTo(other: Expression<String>): Expression<Boolean>
Пример:
val a = "a".stringVariable()
val b = "b".stringVariable()
val result = a notEqualTo b
infix fun Expression<Boolean>.notEqualTo(other: Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Boolean>.notEqualTo(other: Boolean): Expression<Boolean>infix fun Boolean.notEqualTo(other: Expression<Boolean>): Expression<Boolean>
Пример:
val a = "a".booleanVariable()
val b = "b".booleanVariable()
val result = a notEqualTo b
Больше
infix fun Expression<Long>.moreThan(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.moreThan(other: Int): Expression<Boolean>infix fun Expression<Long>.moreThan(other: Long): Expression<Boolean>infix fun Int.moreThan(other: Expression<Long>): Expression<Boolean>infix fun Long.moreThan(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a moreThan b
infix fun Expression<Double>.moreThan(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.moreThan(other: Double): Expression<Boolean>infix fun Expression<Double>.moreThan(other: Float): Expression<Boolean>infix fun Expression<Double>.moreThan(other: Int): Expression<Boolean>infix fun Expression<Double>.moreThan(other: Long): Expression<Boolean>infix fun Double.moreThan(other: Expression<Double>): Expression<Boolean>infix fun Float.moreThan(other: Expression<Double>): Expression<Boolean>infix fun Int.moreThan(other: Expression<Double>): Expression<Boolean>infix fun Long.moreThan(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a moreThan b
Больше или равно
infix fun Expression<Long>.moreThanOrEqualTo(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.moreThanOrEqualTo(other: Int): Expression<Boolean>infix fun Expression<Long>.moreThanOrEqualTo(other: Long): Expression<Boolean>infix fun Int.moreThanOrEqualTo(other: Expression<Long>): Expression<Boolean>infix fun Long.moreThanOrEqualTo(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a moreThanOrEqualTo b
infix fun Expression<Double>.moreThanOrEqualTo(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.moreThanOrEqualTo(other: Double): Expression<Boolean>infix fun Expression<Double>.moreThanOrEqualTo(other: Float): Expression<Boolean>infix fun Expression<Double>.moreThanOrEqualTo(other: Int): Expression<Boolean>infix fun Expression<Double>.moreThanOrEqualTo(other: Long): Expression<Boolean>infix fun Double.moreThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Float.moreThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Int.moreThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Long.moreThanOrEqualTo(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a moreThanOrEqualTo b
Меньше
infix fun Expression<Long>.lessThan(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.lessThan(other: Int): Expression<Boolean>infix fun Expression<Long>.lessThan(other: Long): Expression<Boolean>infix fun Int.lessThan(other: Expression<Long>): Expression<Boolean>infix fun Long.lessThan(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a lessThan b
infix fun Expression<Double>.lessThan(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.lessThan(other: Double): Expression<Boolean>infix fun Expression<Double>.lessThan(other: Float): Expression<Boolean>infix fun Expression<Double>.lessThan(other: Int): Expression<Boolean>infix fun Expression<Double>.lessThan(other: Long): Expression<Boolean>infix fun Double.lessThan(other: Expression<Double>): Expression<Boolean>infix fun Float.lessThan(other: Expression<Double>): Expression<Boolean>infix fun Int.lessThan(other: Expression<Double>): Expression<Boolean>infix fun Long.lessThan(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a lessThan b
Меньше или равно
infix fun Expression<Long>.lessThanOrEqualTo(other: Expression<Long>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Long>.lessThanOrEqualTo(other: Int): Expression<Boolean>infix fun Expression<Long>.lessThanOrEqualTo(other: Long): Expression<Boolean>infix fun Int.lessThanOrEqualTo(other: Expression<Long>): Expression<Boolean>infix fun Long.lessThanOrEqualTo(other: Expression<Long>): Expression<Boolean>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val result = a lessThanOrEqualTo b
infix fun Expression<Double>.lessThanOrEqualTo(other: Expression<Double>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Double>.lessThanOrEqualTo(other: Double): Expression<Boolean>infix fun Expression<Double>.lessThanOrEqualTo(other: Float): Expression<Boolean>infix fun Expression<Double>.lessThanOrEqualTo(other: Int): Expression<Boolean>infix fun Expression<Double>.lessThanOrEqualTo(other: Long): Expression<Boolean>infix fun Double.lessThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Float.lessThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Int.lessThanOrEqualTo(other: Expression<Double>): Expression<Boolean>infix fun Long.lessThanOrEqualTo(other: Expression<Double>): Expression<Boolean>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val result = a lessThanOrEqualTo b
Условные операции
Тернарный оператор
fun Expression<Boolean>.ifElse(onMatch: Expression<Long>, onMismatch: Expression<Long>): Expression<Long>
Варианты перегрузки:
fun Expression<Boolean>.ifElse(onMatch: Expression<Long>, onMismatch: Int): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Expression<Long>, onMismatch: Long): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Int, onMismatch: Expression<Long>): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Long, onMismatch: Expression<Long>): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Int, onMismatch: Int): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Long, onMismatch: Long): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Int, onMismatch: Long): Expression<Long>fun Expression<Boolean>.ifElse(onMatch: Long, onMismatch: Int): Expression<Long>
Пример:
val a = "a".integerVariable()
val b = "b".integerVariable()
val condition = "condition".booleanVariable()
val result = condition.ifElse(a + 20, b - a)
fun Expression<Boolean>.ifElse(onMatch: Expression<Double>, onMismatch: Expression<Double>): Expression<Double>
Варианты перегрузки:
fun Expression<Boolean>.ifElse(onMatch: Expression<Double>, onMismatch: Float): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Expression<Double>, onMismatch: Double): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Float, onMismatch: Expression<Double>): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Double, onMismatch: Expression<Double>): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Float, onMismatch: Int): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Float, onMismatch: Long): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Float, onMismatch: Float): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Float, onMismatch: Double): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Double, onMismatch: Int): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Double, onMismatch: Long): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Double, onMismatch: Float): Expression<Double>fun Expression<Boolean>.ifElse(onMatch: Double, onMismatch: Double): Expression<Double>
Пример:
val a = "a".numberVariable()
val b = "b".numberVariable()
val condition = "condition".booleanVariable()
val result = condition.ifElse(a + 20, b - a)
fun Expression<Boolean>.ifElse(onMatch: Expression<String>, onMismatch: Expression<String>): Expression<String>
Варианты перегрузки:
fun Expression<Boolean>.ifElse(onMatch: String, onMismatch: Expression<String>): Expression<String>fun Expression<Boolean>.ifElse(onMatch: Expression<String>, onMismatch: String): Expression<String>fun Expression<Boolean>.ifElse(onMatch: String, onMismatch: String): Expression<String>
Пример:
val a = "a".booleanVariable()
val b = "b".booleanVariable()
val condition = "condition".booleanVariable()
val result = condition.ifElse(a and b, a or b)
fun Expression<Boolean>.ifElse(onMatch: Expression<Boolean>, onMismatch: Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
-
fun Expression<Boolean>.ifElse( onMatch: Boolean, onMismatch: Expression<Boolean> ): Expression<Boolean> -
fun Expression<Boolean>.ifElse( onMatch: Expression<Boolean>, onMismatch: Boolean ): Expression<Boolean> fun Expression<Boolean>.ifElse(onMatch: Boolean, onMismatch: Boolean): Expression<Boolean>
Пример:
val success_message = "success_message".stringVariable()
val error_message = "error_message".stringVariable()
val condition = "condition".booleanVariable()
val result = condition.ifElse(success_message, error_message)
Try-оператор
Возвращает значение левого операнда, а при его вычислении произошла ошибка — значение правого операнда
infix fun Expression<Long>.tryExpression(Expression<Long>): Expression<Long>
Варианты перегрузки:
infix fun Expression<Long>.tryExpression(Int): Expression<Long>infix fun Expression<Long>.tryExpression(Long): Expression<Long>infix fun Int.tryExpression(Expression<Long>): Expression<Long>infix fun Long.tryExpression(Expression<Long>): Expression<Long>infix fun Int.tryExpression(Int): Expression<Long>infix fun Long.tryExpression(Long): Expression<Long>
Пример:
val missingInt = "missing_int".integerVariable()
val result = missingInt tryExpression 0
infix fun Expression<Double>.tryExpression(Expression<Double>): Expression<Double>
Варианты перегрузки:
infix fun Expression<Double>.tryExpression(Double): Expression<Double>infix fun Expression<Double>.tryExpression(Float): Expression<Double>infix fun Double.tryExpression(Expression<Double>): Expression<Double>infix fun Float.tryExpression(Expression<Double>): Expression<Double>infix fun Float.tryExpression(Float): Expression<Double>infix fun Double.tryExpression(Double): Expression<Double>
Пример:
val missingNumber = "missing_number".numberVariable()
val result = missingNumber tryExpression 0.0
infix fun Expression<String>.tryExpression(Expression<String>): Expression<String>
Варианты перегрузки:
infix fun Expression<String>.tryExpression(String): Expression<String>infix fun String.tryExpression(Expression<String>): Expression<String>infix fun String.tryExpression(String): Expression<String>
Пример:
val missingString = "missing_string".stringVariable()
val result = missingString tryExpression "<missing>"
infix fun Expression<Boolean>.tryExpression(Expression<Boolean>): Expression<Boolean>
Варианты перегрузки:
infix fun Expression<Boolean>.tryExpression(Boolean): Expression<Boolean>infix fun Boolean.tryExpression(Expression<Boolean>): Expression<Boolean>infix fun Boolean.tryExpression(Boolean): Expression<Boolean>
Пример:
val missingBoolean = "missing_boolean".booleanVariable()
val result = missingBoolean tryExpression false
Вызов функций
Встроенные в DivKit функции описаны на отдельной странице.
function<T>(functionName: String, vararg args: Expression<*>): Expression<T>
Позволяет использовать произвольную функцию, в том числе объявленную в верстке.
Примеры использования
Обращение к переменной
val username = "username".stringVariable()
val card = divan {
data(
logId = "variable_test",
variables = listOf(
divkitVariable(
variable = username,
value = "User"
)
),
div = text(
fontSize = 16
).evaluate(
text = ("Hello, ".string() + username).divanExpression()
)
)
}
Результат сериализации:
{
"card": {
"log_id": "variable_test",
"states": [
{
"state_id": 0,
"div": {
"type": "text",
"text": "@{'Hello, ' + greeting}",
"font_size": 16
}
}
],
"variables": [
{
"type": "string",
"name": "username",
"value": "User"
}
]
},
"templates": {}
}
Поддержка тем
const val THEME_LIGHT = "light"
const val THEME_DARK = "dark"
val theme = "theme".stringVariable()
val card = divan {
data(
logId = "theme_test",
div = text(
text = "Lorem ipsum",
fontSize = 16
).evaluate(
textColor = (theme equalTo THEME_LIGHT).ifElse(
onMatch = "#000000".string(),
onMismatch = "#FFFFFF".string()
).divanExpression()
)
)
}
Результат сериализации:
{
"card": {
"log_id": "theme_test",
"states": [
{
"state_id": 0,
"div": {
"type": "text",
"text": "Lorem ipsum",
"font_size": 16,
"text_color": "@{(theme == 'light') ? '#000000' : '#FFFFFF'}"
}
}
]
},
"templates": {}
}
Вызов функции
val priceFormat = "#,###.##".string()
val locale = "ru-RU".string()
val price = "price".integerVariable()
val card = divan {
data(
logId = "function_call_test",
variables = listOf(
divkitVariable(
variable = price,
value = 1000
)
),
div = text(
fontSize = 16
).evaluate(
text = (decimalFormat(price, priceFormat, locale) + " ₽".string()).divanExpression()
)
)
}
Результат сериализации:
{
"card": {
"log_id": "function_call_test",
"states": [
{
"state_id": 0,
"div": {
"type": "text",
"text": "@{decimalFormat(price, '#,###.##', 'ru-RU') + ' ₽'}",
"font_size": 16
}
}
],
"variables": [
{
"type": "integer",
"name": "price",
"value": 1000
}
]
},
"templates": {}
}
Обновление значений переменных
val complexData = "complex_data".dictVariable<Any>()
val card = divan {
data(
logId = "variable_change_test",
variables = listOf(
divkitVariable(
variable = complexData,
value = mapOf(
"integer_param" to 10,
"number_param" to 10.0,
"string_param" to "Lorem ipsum",
"boolean_param" to false
)
)
),
div = text(
text = "Update data",
fontSize = 16,
actions = listOf(
action(
logId = "update_integer_param",
typed = actionDictSetValue(
variableName = complexData.name,
key = "integer_param",
value = integerValue(value = 20)
)
),
action(
logId = "update_number_param",
typed = actionDictSetValue(
variableName = complexData.name,
key = "number_param",
value = numberValue(value = 20.0)
)
),
action(
logId = "update_string_param",
typed = actionDictSetValue(
variableName = complexData.name,
key = "string_param",
value = stringValue(value = "Dolor sit amet")
)
),
action(
logId = "update_boolean_param",
typed = actionDictSetValue(
variableName = complexData.name,
key = "boolean_param",
value = booleanValue(value = true)
)
)
)
)
)
}
Результат сериализации:
{
"card": {
"log_id": "variable_change_test",
"states": [
{
"state_id": 0,
"div": {
"type": "text",
"text": "Update data",
"actions": [
{
"log_id": "update_integer_param",
"typed": {
"type": "dict_set_value",
"key": "integer_param",
"value": {
"type": "integer",
"value": 20
},
"variable_name": "complex_data"
}
},
{
"log_id": "update_number_param",
"typed": {
"type": "dict_set_value",
"key": "number_param",
"value": {
"type": "number",
"value": 20.0
},
"variable_name": "complex_data"
}
},
{
"log_id": "update_string_param",
"typed": {
"type": "dict_set_value",
"key": "string_param",
"value": {
"type": "string",
"value": "Dolor sit amet"
},
"variable_name": "complex_data"
}
},
{
"log_id": "update_boolean_param",
"typed": {
"type": "dict_set_value",
"key": "boolean_param",
"value": {
"type": "boolean",
"value": 1
},
"variable_name": "complex_data"
}
}
],
"font_size": 16
}
}
],
"variables": [
{
"type": "dict",
"name": "complex_data",
"value": {
"integer_param": 10,
"number_param": 10.0,
"string_param": "Lorem ipsum",
"boolean_param": false
}
}
]
},
"templates": {}
}
Узнать больше
Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.