Kotlin DSL allows using Property of other class

26 Views Asked by At

I'm new to Kotlin DSL and unfortunately I can't find a corresponding reference in the documentation. I probably missed that somewhere and also can't find the right keywords for a successful search on Google.

I have the following code

data class Address(val street: String, val number: String, val city: String)
data class Person(val name: String, val age: Int, val email: String, val address: Address)

class AddressBuilder(
    var street: String = "Blumenstraße",
    var number: String = "13",
    var city: String = "Entenhausen",
) {
    fun build() = Address(street, number, city)
}

class PersonBuilder {
    var name: String = "Donald Duck"
    var age: Int = 41
    var email: String = "[email protected]"
    private var addressBuilder: AddressBuilder = AddressBuilder()

    fun address(block: AddressBuilder.() -> Unit) {
        addressBuilder.apply(block)
    }

    fun build() = Person(name, age, email, addressBuilder.build())
}

fun person(block : PersonBuilder.() -> Unit) = PersonBuilder().apply(block).build()

println(person {
    name = "Tick Duck"
    email = "[email protected]"
    age = 13
    address {
        street = "Blumenstraße"
        number = "13"
        city = "Entenhausen"
        email = "[email protected]"
    }
})

Output is Person(name=Tick Duck, age=13, [email protected], address=Address(street=Blumenstraße, number=13, city=Entenhausen))

My question: why can I set email in address?

Thanks for reading this!

0

There are 0 best solutions below