1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-06-16 13:20:52 -07:00

Restructure the entry point for easier testing.

This commit is contained in:
Cedric Beust 2017-04-06 10:52:17 -07:00
parent f2297fcfc3
commit 24d902bfbf

View file

@ -17,12 +17,32 @@ import java.net.URLClassLoader
import javax.inject.Inject
fun main(argv: Array<String>) {
val result = mainNoExit(argv)
val result = Main.mainNoExit(argv)
if (result != 0) {
System.exit(result)
}
}
class Main @Inject constructor(
val plugins: Plugins,
val http: Http,
val files: KFiles,
val executors: KobaltExecutors,
val dependencyManager: DependencyManager,
val github: GithubApi2,
val updateKobalt: UpdateKobalt,
val client: KobaltClient,
val pluginInfo: PluginInfo,
val options: Options) {
companion object {
fun mainNoExit(argv: Array<String>): Int {
val (jc, args) = parseArgs(argv)
Kobalt.init(MainModule(args, KobaltSettings.readSettingsXml()))
val result = launchMain(Kobalt.INJECTOR.getInstance(Main::class.java), jc, args, argv)
return result
}
private fun parseArgs(argv: Array<String>): Main.RunInfo {
val args = Args()
val result = JCommander(args)
@ -35,29 +55,18 @@ private fun parseArgs(argv: Array<String>): Main.RunInfo {
return Main.RunInfo(result, args)
}
fun mainNoExit(argv: Array<String>): Int {
val (jc, args) = parseArgs(argv)
Kobalt.init(MainModule(args, KobaltSettings.readSettingsXml()))
val result = Kobalt.INJECTOR.getInstance(Main::class.java).run {
/**
* Entry point for tests, which can instantiate their main object with their own module and injector.
*/
fun launchMain(main: Main, jc: JCommander, args: Args, argv: Array<String>) : Int {
return main.run {
val runResult = run(jc, args, argv)
pluginInfo.cleanUp()
executors.shutdown()
runResult
}
return result
}
private class Main @Inject constructor(
val plugins: Plugins,
val http: Http,
val files: KFiles,
val executors: KobaltExecutors,
val dependencyManager: DependencyManager,
val github: GithubApi2,
val updateKobalt: UpdateKobalt,
val client: KobaltClient,
val pluginInfo: PluginInfo,
val options: Options) {
}
data class RunInfo(val jc: JCommander, val args: Args)