package starter.modules import com.mitchellbosecke.pebble.extension.escaper.SafeString import com.mitchellbosecke.pebble.template.EvaluationContext import com.mitchellbosecke.pebble.template.PebbleTemplate import org.intellij.lang.annotations.Language import org.koin.dsl.bind import org.koin.dsl.module import starter.Dependency import starter.utils.PebbleEngineBuilder import starter.utils.PebbleEngineBuilder.CacheType.ConcurrentMap import starter.utils.PebbleFunction class DepAsXmlPebbleFunction : PebbleFunction { override val name = "depAsXml" override fun getArgumentNames() = listOf("dependency") override fun execute(args: Map, self: PebbleTemplate, context: EvaluationContext, lineNumber: Int): Any { val dep = args["dependency"] as Dependency fun startTag(name: String): String { @Language("html") @Suppress("UnnecessaryVariable") val result = """<$name>""" return result } fun endTag(name: String): String { @Language("html") @Suppress("UnnecessaryVariable") val result = """</$name>""" return result } fun tag(name: String, content: String): String { return """${startTag(name)}$content${endTag(name)}""" } val result = """ |${startTag("dependency")} | ${tag("groupId", dep.groupId)} | ${tag("artifactId", dep.artifactId)} | ${tag("version", dep.version.value)} |${endTag("dependency")} """.trimMargin() return SafeString(result) } } val pebbleModule = module { single { DepAsXmlPebbleFunction() } bind PebbleFunction::class single { PebbleEngineBuilder { cache = ConcurrentMap functions(getAll()) classPath { suffix = ".twig" } } } }