KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/tools/Sbon2Json.kt

122 lines
3.0 KiB
Kotlin

package ru.dbotthepony.kstarbound.tools
import com.google.gson.GsonBuilder
import ru.dbotthepony.kstarbound.io.readHeader
import ru.dbotthepony.kstarbound.io.readString
import ru.dbotthepony.kstarbound.io.readVarInt
import ru.dbotthepony.kstarbound.json.readJsonElement
import java.io.BufferedInputStream
import java.io.DataInputStream
import java.io.File
import java.io.OutputStreamWriter
import java.util.Scanner
import kotlin.system.exitProcess
fun main(vararg args: String) {
var originalFile = args.getOrNull(0)
val scanner = System.`in`?.let(::Scanner)
var interactive = false
if (originalFile == null) {
if (scanner == null) {
System.err.println("Usage: <original file path> [output file path]")
System.err.println("By default, new file is put in the same folder as original file")
System.err.println("with '.json' extension added to it")
exitProcess(1)
} else {
println("Input filename:")
originalFile = scanner.nextLine()
interactive = true
}
}
val f = File(originalFile!!).absoluteFile
if (!f.exists()) {
System.err.println("File $f does not exist")
exitProcess(1)
}
if (!f.isFile) {
System.err.println("$f is not a file")
exitProcess(1)
}
var newFile = args.getOrNull(1)
if (newFile == null) {
if (interactive) {
val def = f.parent + "/" + f.name + ".json"
println("Output filename [$def]:")
val read = scanner!!.nextLine()
if (read == "") {
newFile = def
} else {
newFile = read!!
}
} else {
newFile = f.parent + "/" + f.name + ".json"
}
}
val new = File(newFile)
if (!new.parentFile.exists()) {
System.err.println("Output directory ${new.parent} does not exist")
exitProcess(1)
}
if (!new.parentFile.isDirectory) {
System.err.println("Output directory ${new.parent} is not a directory")
exitProcess(1)
}
if (new.exists() && !new.isFile) {
System.err.println("Output path $new already exists and it is not a file")
exitProcess(1)
}
if (interactive && new.exists()) {
println("$new already exists. Overwrite? [Y/n]")
var next = scanner!!.nextLine()
if (next == "") next = "y"
if (next.lowercase()[0] != 'y') {
System.err.println("Halt")
exitProcess(1)
}
}
try {
val t = System.nanoTime()
val dataStream = DataInputStream(BufferedInputStream(f.inputStream()))
dataStream.readHeader("SBVJ01")
val name = dataStream.readString(dataStream.readVarInt())
val magic = dataStream.read()
val version = dataStream.readInt()
val data = dataStream.readJsonElement()
val gson = GsonBuilder().setPrettyPrinting().create()
dataStream.close()
println("$f:")
println("JSON Name: $name")
println("Version: $version")
println("Magic: $magic")
println("JSON Type: ${data::class.simpleName}")
new.delete()
val output = OutputStreamWriter(new.outputStream())
gson.toJson(data, output)
output.close()
println("Successfully written data to $new ${"in %.2f ms".format(((System.nanoTime() - t) / 1_000L) / 1_000.0)}")
exitProcess(0)
} catch(err: Throwable) {
System.err.println(err)
exitProcess(1)
}
}