0

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 = "donald@duck.com"
    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 = "tick@duck.de"
    age = 13
    address {
        street = "Blumenstraße"
        number = "13"
        city = "Entenhausen"
        email = "cry@why.com"
    }
})

Output is Person(name=Tick Duck, age=13, email=cry@why.com, address=Address(street=Blumenstraße, number=13, city=Entenhausen))

My question: why can I set email in address?

Thanks for reading this!

Lars Michaelis
  • 559
  • 2
  • 6
  • 11
  • Thank you so much. I'm looking for it for hours. With your link I found https://kotlinlang.org/docs/type-safe-builders.html#scope-control-dslmarker. I don't understand how I could have missed that. Thanks so much! – Lars Michaelis Jun 22 '23 at 12:47

0 Answers0