1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 08:27:12 -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,37 +17,13 @@ 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)
}
}
private fun parseArgs(argv: Array<String>): Main.RunInfo {
val args = Args()
val result = JCommander(args)
result.parse(*argv)
KobaltLogger.LOG_LEVEL = if (args.log < Constants.LOG_QUIET_LEVEL) {
Constants.LOG_DEFAULT_LEVEL
} else if (args.log > Constants.LOG_MAX_LEVEL) {
Constants.LOG_MAX_LEVEL
} else args.log
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 {
val runResult = run(jc, args, argv)
pluginInfo.cleanUp()
executors.shutdown()
runResult
}
return result
}
private class Main @Inject constructor(
class Main @Inject constructor(
val plugins: Plugins,
val http: Http,
val files: KFiles,
@ -59,6 +35,39 @@ private class Main @Inject constructor(
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)
result.parse(*argv)
KobaltLogger.LOG_LEVEL = if (args.log < Constants.LOG_QUIET_LEVEL) {
Constants.LOG_DEFAULT_LEVEL
} else if (args.log > Constants.LOG_MAX_LEVEL) {
Constants.LOG_MAX_LEVEL
} else args.log
return Main.RunInfo(result, args)
}
/**
* 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
}
}
}
data class RunInfo(val jc: JCommander, val args: Args)
private fun installCommandLinePlugins(args: Args): ClassLoader {