summaryrefslogtreecommitdiff
path: root/src/main/kotlin/DefMain.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/DefMain.kt')
-rw-r--r--src/main/kotlin/DefMain.kt183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/main/kotlin/DefMain.kt b/src/main/kotlin/DefMain.kt
new file mode 100644
index 0000000..6d58a99
--- /dev/null
+++ b/src/main/kotlin/DefMain.kt
@@ -0,0 +1,183 @@
+import kotlinx.serialization.DeserializationStrategy
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.json.*
+import java.io.File
+import java.io.PrintWriter
+
+@Serializable
+data class LModule(
+ val Namespace: String? = null,
+ val Functions: List<LFunction> = listOf(),
+ val Tables: List<LTable> = listOf(),
+)
+
+@Serializable
+data class LTypeUse(
+ val Type: String,
+ val InnerType: String? = null,
+ val Name: String,
+ val Nilable: Boolean,
+)
+
+@Serializable
+data class LEnumValue(
+ val Type: String,
+ val Name: String,
+ val EnumValue: Long,
+)
+
+@Serializable
+data class LFunction(
+ val Returns: List<LTypeUse> = listOf(),
+ val Name: String,
+ val Arguments: List<LTypeUse> = listOf(),
+)
+
+
+@Serializable(with = LTable.Serializer::class)
+sealed class LTable {
+ object Serializer : JsonContentPolymorphicSerializer<LTable>(LTable::class) {
+ override fun selectDeserializer(element: JsonElement): DeserializationStrategy<LTable> {
+ element as JsonObject
+ return when ((element["Type"] as JsonPrimitive).content) {
+ "Structure" -> LStructure.serializer()
+ "Enumeration" -> LEnumeration.serializer()
+ else -> {
+ println("Unknown type " + element["Type"])
+ LUnknownObject.serializer()
+ }
+ }
+ }
+ }
+}
+
+@Serializable
+data class LStructure(
+ val Name: String,
+ val Fields: List<LTypeUse>,
+) : LTable()
+
+@Serializable
+data object LUnknownObject : LTable()
+
+@Serializable
+data class LEnumeration(
+ val Name: String,
+ val MinValue: Long,
+ val NumValues: Long,
+ val MaxValue: Long,
+ val Fields: List<LEnumValue>,
+) : LTable()
+
+fun String?.postFixedWithOrEmpty(text: String): String {
+ return if (this.isNullOrBlank()) ""
+ else this + text
+}
+
+fun compositeTypeStr(module: LModule, field: LTypeUse): String {
+ return if (field.InnerType == null) field.Type else module.Namespace.postFixedWithOrEmpty(
+ "."
+ ) + field.InnerType + "[]"
+}
+
+fun main() {
+ val json1 = Json { ignoreUnknownKeys = true }
+ val luaMeta = PrintWriter(File("definitions.lua"))
+ luaMeta.println("---@meta")
+ luaMeta.println()
+
+ luaMeta.println("---@alias bool boolean")
+ luaMeta.println("---@alias BigInteger number")
+ luaMeta.println("---@alias BigUInteger number")
+ luaMeta.println("---@alias cstring string")
+ luaMeta.println("---@alias CalendarEventID string")
+ luaMeta.println("---@alias ClubId string")
+ luaMeta.println("---@alias ClubInvitationId string")
+ luaMeta.println("---@alias ClubStreamId string")
+ luaMeta.println("---@alias FileAsset string")
+ luaMeta.println("---@alias fileID number")
+ luaMeta.println("---@alias GarrisonFollower string")
+ luaMeta.println("---@alias IDOrLink string|number")
+ luaMeta.println("---@alias kstringClubMessage string")
+ luaMeta.println("---@alias kstringLfgListApplicant string")
+ luaMeta.println("---@alias kstringLfgListSearch string")
+ luaMeta.println("---@alias luaIndex number")
+ luaMeta.println("---@alias ModelAsset string")
+ luaMeta.println("---@alias normalizedValue string")
+ luaMeta.println("---@alias RecruitAcceptanceID string")
+ luaMeta.println("---@alias ScriptRegion SimpleScriptRegion")
+ luaMeta.println("---@alias SimpleButtonStateToken string")
+ luaMeta.println("---@alias SingleColorValue number")
+ luaMeta.println("---@alias size number")
+ luaMeta.println("---@alias TBFFlags string")
+ luaMeta.println("---@alias TBFStyleFlags string")
+ luaMeta.println("---@alias textureAtlas string")
+ luaMeta.println("---@alias textureKit string")
+ luaMeta.println("---@alias time_t number")
+ luaMeta.println("---@alias uiAddon string")
+ luaMeta.println("---@alias uiFontHeight number")
+ luaMeta.println("---@alias uiMapID number")
+ luaMeta.println("---@alias uiUnit number")
+ luaMeta.println("---@alias UnitToken string")
+ luaMeta.println("---@alias WeeklyRewardItemDBID string")
+ luaMeta.println("---@alias WOWGUID string")
+ luaMeta.println("---@alias WOWMONEY string")
+
+ for (module in json1.decodeFromString<List<LModule>>(File("generated.json").readText())) {
+ luaMeta.println()
+ if (module.Namespace != null) {
+ luaMeta.println("${module.Namespace} = {}")
+ luaMeta.println()
+ }
+ for (table in module.Tables) {
+ when (table) {
+ is LEnumeration -> {
+ luaMeta.println("---@enum ${table.Name}")
+ luaMeta.println("${table.Name} = {")
+ for (field in table.Fields) {
+ luaMeta.println(" ${field.Name} = ${field.EnumValue};")
+ }
+ luaMeta.println("}")
+ luaMeta.println()
+ }
+
+ is LStructure -> {
+ luaMeta.println("---@class ${module.Namespace.postFixedWithOrEmpty(".")}${table.Name}")
+ for (field in table.Fields) {
+ luaMeta.println(
+ "---@field ${field.Name} ${
+ compositeTypeStr(
+ module,
+ field
+ )
+ }${if (field.Nilable) "|nil" else ""}"
+ )
+ }
+ luaMeta.println()
+ }
+
+ LUnknownObject -> {
+ }
+ }
+ }
+ for (func in module.Functions) {
+ for (ret in func.Returns) {
+ luaMeta.println(
+ "---@return ${
+ compositeTypeStr(
+ module,
+ ret
+ )
+ }${if (ret.Nilable) "|nil" else ""} ${ret.Name}"
+ )
+ }
+ for (par in func.Arguments) {
+ luaMeta.println("---@param ${par.Name}${if (par.Nilable) "?" else ""} ${compositeTypeStr(module, par)}")
+ }
+ luaMeta.println("function ${module.Namespace.postFixedWithOrEmpty(".")}${func.Name}(${func.Arguments.joinToString { it.Name }}) end")
+ luaMeta.println()
+ }
+ }
+ luaMeta.close()
+}
+