package me.eater.hefbrug.executor import me.eater.hefbrug.dsl.Location import me.eater.hefbrug.dsl.context.RootContext import me.eater.hefbrug.dsl.context.SourceContext import me.eater.hefbrug.dsl.context.extension_util.Register import me.eater.hefbrug.dsl.scope.SelectorScope import me.eater.hefbrug.logging.Logging import org.apache.logging.log4j.Level import org.apache.logging.log4j.MarkerManager import java.io.File import java.nio.file.Paths import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.constructorArgs import kotlin.script.experimental.api.implicitReceivers import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate class Executor(val context: RootContext = RootContext()) : Logging { private val compilationConfiguration = createJvmCompilationConfigurationFromTemplate() fun run(name: String) { val location = Location.File(Paths.get(name).toRealPath().toString()) val evaluationConfiguration = createJvmEvaluationConfigurationFromTemplate { constructorArgs(context, location) implicitReceivers(SourceContext(context, location, this@Executor)) } val diags = BasicJvmScriptingHost().eval( File(location.path).toScriptSource(), compilationConfiguration, evaluationConfiguration ) for (d in diags.reports) { log( when (d.severity) { ScriptDiagnostic.Severity.DEBUG -> Level.forName("SCRIPT", 700) ScriptDiagnostic.Severity.INFO -> Level.DEBUG ScriptDiagnostic.Severity.WARNING -> Level.INFO ScriptDiagnostic.Severity.ERROR -> Level.ERROR ScriptDiagnostic.Severity.FATAL -> Level.FATAL }, MarkerManager.getMarker("script"), "[@|blue ${location.path}|@] ${d.message} ${d.location ?: ""}" ) if (d.exception != null) { d.exception!!.printStackTrace() } } } fun getScope(): SelectorScope = Register[context.contextUUID].selectorScope init { Register.register(Register(context.contextUUID)) } }