view src/main/kotlin/name/blackcap/passman/Main.kt @ 4:02b101422726

See bugs.
author David Barts <n5jrn@me.com>
date Sun, 11 Sep 2022 20:44:59 -0700
parents eafa3779aef8
children 698c4a3d758d
line wrap: on
line source

package name.blackcap.passman

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import java.util.stream.Collectors
import kotlin.reflect.jvm.javaMethod
import kotlin.reflect.jvm.kotlinFunction
import kotlin.system.exitProcess

fun main(args: Array<String>) {
    if (args.isEmpty()) {
        error("expecting subcommand")
        exitProcess(2)
    }
    val subcommand = args[0];
    val scArgs = args.sliceArray(1 until args.size)
    runSubcommand(subcommand, scArgs)
}

fun runSubcommand(name: String, args: Array<String>): Unit {
    val instance = getInstanceForClass(getClassForSubcommand(name))
    if (instance == null) {
        die("${see(name)} - unknown subcommand", 2)
    } else {
        instance.run(args)
    }
}

fun getClassForSubcommand(name: String): Class<Subcommand>? = try {
    val shortName = name.replace('-', '_')
        .lowercase()
        .replaceFirstChar { it.titlecase(Locale.getDefault()) }
    Class.forName("$MAIN_PACKAGE.${shortName}Subcommand") as? Class<Subcommand>
    /* val ret = Class.forName("$MAIN_PACKAGE.$shortName")
    if (ret.isInstance(Subcommand::class.java)) { ret as Class<Subcommand> } else { null } */
} catch (e: ClassNotFoundException) {
    null
}

fun getInstanceForClass(klass: Class<Subcommand>?) = try {
    klass?.getDeclaredConstructor()?.newInstance()
} catch (e: ReflectiveOperationException) {
    null
}