SDK ReferenceKotlin SDK

Kotlin SDK Reference

Maven Central

Installation

Gradle (Kotlin DSL)

dependencies {
    implementation("io.github.issadicko:kodi-script:0.1.1")
}

Gradle (Groovy)

implementation 'io.github.issadicko:kodi-script:0.1.1'

Maven

<dependency>
    <groupId>io.github.issadicko</groupId>
    <artifactId>kodi-script</artifactId>
    <version>0.1.1</version>
</dependency>

Quick Start

import com.kodi.script.KodiScript
 
val result = KodiScript.run("""
    let name = "World"
    print("Hello " + name)
""")
 
result.output.forEach { println(it) }

Variable Injection

val variables = mapOf(
    "user" to mapOf(
        "name" to "Alice",
        "role" to "admin"
    )
)
 
val result = KodiScript.run("""
    let greeting = "Hello " + user.name
    let status = user?.active ?: "offline"
    print(greeting)
""", variables)

Builder Pattern

val result = KodiScript.builder("""
    let greeting = customGreet("World")
    print(greeting)
""")
    .withVariable("version", 1.0)
    .registerFunction("customGreet") { args ->
        "Hello, ${args[0]}!"
    }
    .execute()

Spring Boot Integration

@Service
class ScriptService {
    fun executeUserScript(script: String, context: Map<String, Any?>): ScriptResult {
        return KodiScript.builder(script)
            .withVariables(context)
            .execute()
    }
}
 
@RestController
@RequestMapping("/api/scripts")
class ScriptController(private val scriptService: ScriptService) {
    @PostMapping("/execute")
    fun execute(@RequestBody request: ScriptRequest): ScriptResult {
        return scriptService.executeUserScript(request.script, request.context)
    }
}

Result & Error Handling

execute() returns a ScriptResult. Branch on the typed errorKind rather than parsing error strings:

data class ScriptResult(
    val value: Any?,
    val output: List<String>,
    val errors: List<String>,
    val errorKind: ErrorKind   // NONE on success
)
 
enum class ErrorKind { NONE, PARSE, RUNTIME, TIMEOUT, MAX_OPERATIONS }
val result = KodiScript.builder(script)
    .withMaxOperations(1000)
    .execute()
 
when (result.errorKind) {
    ErrorKind.NONE -> useResult(result.value, result.output)
    ErrorKind.PARSE -> /* syntax error */ Unit
    ErrorKind.RUNTIME -> /* bad operation, undefined variable, recursion, ... */ Unit
    ErrorKind.TIMEOUT -> /* exceeded withTimeout */ Unit
    ErrorKind.MAX_OPERATIONS -> /* exceeded withMaxOperations */ Unit
}

Streaming & Capturing Output

By default print() writes to stdout and is also captured in result.output. Use withSilentPrint to suppress the console write, or withOutput to route each line to a callback:

val lines = mutableListOf<String>()
KodiScript.builder("""print("a") print("b")""")
    .withOutput { line -> lines.add(line) }   // lines == ["a", "b"]
    .execute()
 
// Capture only, no console output:
val result = KodiScript.builder(script)
    .withSilentPrint(true)
    .execute()