@Bean
fun d1snin(): Human = developer {
general {
name = "Mikhail Koshkin"
age = 15
}
knowledge {
languages {
language {
name = "Kotlin"
experienceYears = 0.5
}
language {
name = "Java"
experienceYears = 1.0
}
}
frameworks {
framework {
name = "Spring Framework"
modules = listOf(
"core",
"data",
"web",
"security",
"cloud"
)
experienceYears = 0.2
}
}
}
contacts {
contact {
service = "discord"
address = "d1snin#3007"
}
contact {
service = "e-mail"
address = listOf("~", "@", "d1s.uno").joinToString()
}
contact {
service = "slack-connect"
address = "d1snin@aol.com"
}
contact {
service = "telegram"
address = "@d1snin"
}
}
}
@DslMarker
annotation class DeveloperDslMarker
@DeveloperDslMarker
open class Human {
lateinit var name: String
var age by Delegates.notNull<Int>()
}
@DeveloperDslMarker
open class Knowledge {
lateinit var name: String
var experienceYears by Delegates.notNull<Double>()
}
@DeveloperDslMarker
class Language : Knowledge()
@DeveloperDslMarker
class Framework : Knowledge() {
lateinit var modules: List<String>
}
@DeveloperDslMarker
class LanguageContext(
val dev: Developer
) {
inline fun language(languageCtx: Language.() -> Unit) =
this.dev.languages.add(Language().apply(languageCtx))
}
@DeveloperDslMarker
class FrameworkContext(
val dev: Developer
) {
inline fun framework(frameworkCtx: Framework.() -> Unit) =
this.dev.frameworks.add(Framework().apply(frameworkCtx))
}
@DeveloperDslMarker
class KnowledgeContext(
val dev: Developer
) {
inline fun languages(languageCtx: LanguageContext.() -> Unit) =
languageCtx(LanguageContext(dev))
inline fun frameworks(frameworkCtx: FrameworkContext.() -> Unit) =
frameworkCtx(FrameworkContext(dev))
}
@DeveloperDslMarker
class Contact {
lateinit var service: String
lateinit var address: String
}
@DeveloperDslMarker
class ContactContext(
val dev: Developer
) {
inline fun contact(contactCtx: Contact.() -> Unit) =
dev.contacts.add(Contact().apply(contactCtx))
}
@DeveloperDslMarker
class Developer : Human() {
val languages = mutableListOf<Language>()
val frameworks = mutableListOf<Framework>()
val contacts = mutableListOf<Contact>()
companion object {
inline fun developer(developerCtx: Developer.() -> Unit): Developer =
Developer().apply(developerCtx)
}
inline fun general(humanCtx: Human.() -> Unit) =
this.apply(humanCtx)
inline fun knowledge(knowledgeCtx: KnowledgeContext.() -> Unit) =
knowledgeCtx(KnowledgeContext(this))
inline fun contacts(contactCtx: ContactContext.() -> Unit) =
contactCtx(ContactContext(this))
}
/ I think I overdid it. /