view src/main/kotlin/name/blackcap/passman/Main.kt @ 21:ea65ab890f66

More work to support interactive feature.
author David Barts <n5jrn@me.com>
date Tue, 02 Jul 2024 11:27:39 -0700
parents 698c4a3d758d
children 07406c4af4a5
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)
    Database.default = Database.open()
    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>
} catch (e: ClassNotFoundException) {
    null
}

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