Есть ли способ сгенерировать kotlin dsl с использованием данных - PullRequest
3 голосов
/ 21 июня 2020

Мы используем kotlin dsl to как удобный конструктор для ввода и генерации данных. Есть ли способ сделать наоборот? ie, преобразовать существующие данные в dsl?

Можно ли преобразовать это kotlin представление в dsl?

val person = Person("John", 25)
val person = person {
    name = "John"
    age = 25
}

1 Ответ

2 голосов
/ 21 июня 2020

Если вы действительно не без ума от { и некоторых запятых, ниже приведен абсолютно действительный Kotlin код:

data class Person(
    val name: String,
    val age: Int
)

val person = Person(
    name = "John",
    age = 25
)

Я действительно близок к тому, что вы хотите, и выходит из- the-box.

Конечно, вы можете добиться желаемого синтаксиса, написав дополнительный код, например:

import kotlin.properties.Delegates

data class Person(
    val name: String,
    val age: Int
)

class PersonDSL{
    lateinit var name: String 
    var age: Int by Delegates.notNull<Int>()

    fun toPerson(): Person = Person(this.name, this.age)
}

fun person(config: PersonDSL.() -> Unit): Person{
    val dsl = PersonDSL()
    
    dsl.config()
    
    return dsl.toPerson()
}

fun main(){
    val person = person {
        name = "John"
        age = 25
    }
    println(person) // Person(name=John, age=25)
}

Но зачем это делать?

...