package be.vandewalleh import be.vandewalleh.extensions.ApplicationBuilder import be.vandewalleh.extensions.RoutingBuilder import io.ktor.application.Application import io.ktor.application.log import io.ktor.routing.routing import io.ktor.server.engine.* import io.ktor.server.netty.Netty import org.kodein.di.DI import org.kodein.di.description import org.kodein.di.instance import org.slf4j.Logger import java.util.concurrent.TimeUnit fun main() { val di = DI { import(mainModule) } val config by di.instance() val logger by di.instance() logger.info("Running application with configuration $config") logger.debug("Kodein bindings\n${di.container.tree.bindings.description()}") serve(di) } fun serve(di: DI) { val config by di.instance() val logger by di.instance() val env = applicationEngineEnvironment { module { module(di) } log = logger connector { host = config.server.host port = config.server.port } } with(embeddedServer(Netty, env)) { addShutdownHook { stop(1, 5, TimeUnit.SECONDS) } start(wait = true) } } fun Application.module(di: DI) { val builders: Set by di.instance() builders.forEach { it.builder(this) } routing { trace { application.log.trace(it.buildText()) } } val routingBuilders: Set by di.instance() routingBuilders.forEach { routing(it.builder) } }