Skip to content

Commit 1146d41

Browse files
committed
[wip] MapperNode: support liquid
1 parent b25c17b commit 1146d41

File tree

6 files changed

+83
-35
lines changed

6 files changed

+83
-35
lines changed

Diff for: build.gradle.kts

+6-3
Original file line numberDiff line numberDiff line change
@@ -184,14 +184,17 @@ dependencies {
184184
}
185185
}
186186

187+
if (isDevelopment) {
188+
tasks.run.configure {
189+
classpath += devSourceSet.output
190+
}
191+
}
192+
187193
application {
188194
mainClass.set("me.snoty.backend.ApplicationKt")
189195

190196
if (isDevelopment) {
191197
applicationDefaultJvmArgs += "-Dio.ktor.development=$isDevelopment"
192-
tasks.run.configure {
193-
classpath += devSourceSet.output
194-
}
195198
}
196199
}
197200

Diff for: integrations/api/build.gradle.kts

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,41 @@
11
plugins {
2-
alias(libs.plugins.kotlin.jvm)
3-
alias(libs.plugins.kotlin.serialization)
4-
alias(libs.plugins.kotlin.kover)
2+
alias(libs.plugins.kotlin.jvm)
3+
alias(libs.plugins.kotlin.serialization)
4+
alias(libs.plugins.kotlin.kover)
55
}
66

77
dependencies {
8-
api(projects.api)
8+
api(projects.api)
99

10-
implementation(database.mongodb)
10+
implementation(database.mongodb)
1111

12-
api(ktor.client.core)
13-
api(ktor.client.apache)
14-
api(ktor.client.contentNegotiation)
15-
api(ktor.serialization.kotlinx.json)
16-
api(ktor.server.core)
17-
api(ktor.server.auth)
12+
api(ktor.client.core)
13+
api(ktor.client.apache)
14+
api(ktor.client.contentNegotiation)
15+
api(ktor.serialization.kotlinx.json)
16+
api(ktor.server.core)
17+
api(ktor.server.auth)
1818

19-
api(monitoring.micrometer)
20-
api(monitoring.ktor.opentelemetry)
19+
api(monitoring.micrometer)
20+
api(monitoring.ktor.opentelemetry)
2121

22-
api(libraries.jackson.core)
23-
api(libraries.jackson.kotlin)
24-
api(libraries.bson.kotlinx)
22+
api(libraries.jackson.core)
23+
api(libraries.jackson.kotlin)
24+
api(libraries.bson.kotlinx)
25+
26+
// liquid for java
27+
implementation("nl.big-o:liqp:0.9.0.3")
2528

2629
testImplementation(kotlin("test"))
27-
testImplementation(tests.mockk)
30+
testImplementation(tests.mockk)
2831
}
2932

3033
base.archivesName = "integration-api"
3134

3235
subprojects {
33-
base.archivesName = "integration-${this.name}"
36+
base.archivesName = "integration-${this.name}"
3437
}
3538

3639
tasks.test {
37-
useJUnitPlatform()
38-
}
40+
useJUnitPlatform()
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package me.snoty.integration.common.wiring.node.impl.mapper
2+
3+
import liqp.TemplateParser
4+
import org.bson.Document
5+
6+
object MapperEngines {
7+
private val engines = mutableMapOf<String, Templater>()
8+
9+
private fun engine(name: String, templater: Templater) {
10+
engines[name] = templater
11+
}
12+
13+
init {
14+
engine("replace") { settings, data ->
15+
val mappedData = Document()
16+
settings.fields.forEach { (key, value) ->
17+
var result = value
18+
for (field in data) {
19+
result = result.replace("%${field.key}%", field.value.toString())
20+
}
21+
mappedData[key] = result
22+
}
23+
24+
mappedData
25+
}
26+
27+
engine("liquid") { settings, data ->
28+
val mappedData = Document()
29+
settings.fields.forEach { (key, value) ->
30+
val template = TemplateParser.DEFAULT.parse(value)
31+
val rendered = template.render(data as Map<String, Any>)
32+
33+
mappedData[key] = rendered
34+
}
35+
36+
mappedData
37+
}
38+
}
39+
40+
fun get(settings: MapperSettings): Templater? {
41+
return engines[settings.engine]
42+
}
43+
}

Diff for: integrations/api/src/main/kotlin/me/snoty/integration/common/wiring/node/impl/MapperNode.kt renamed to integrations/api/src/main/kotlin/me/snoty/integration/common/wiring/node/impl/mapper/MapperNode.kt

+5-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package me.snoty.integration.common.wiring.node.impl
1+
package me.snoty.integration.common.wiring.node.impl.mapper
22

33
import kotlinx.serialization.Serializable
44
import me.snoty.integration.common.wiring.*
@@ -21,18 +21,12 @@ class MapperNodeHandler(override val nodeHandlerContext: NodeHandlerContext) : N
2121

2222
context(NodeHandlerContext, EmitNodeOutputContext)
2323
override suspend fun process(logger: Logger, node: IFlowNode, input: IntermediateData) {
24-
val config: MapperSettings = node.getConfig()
24+
val settings: MapperSettings = node.getConfig()
2525
val data: Document = input.get()
26+
val engine = MapperEngines.get(settings)
27+
?: throw IllegalStateException("Engine not found!")
2628

27-
val mappedData = Document()
28-
// TODO: templating engine
29-
config.fields.forEach { (key, value) ->
30-
var result = value
31-
for (field in data) {
32-
result = result.replace("%${field.key}%", field.value.toString())
33-
}
34-
mappedData[key] = result
35-
}
29+
val mappedData = engine(settings, data)
3630

3731
structOutput {
3832
mappedData
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package me.snoty.integration.common.wiring.node.impl.mapper
2+
3+
import org.bson.Document
4+
5+
typealias Templater = (settings: MapperSettings, data: Document) -> Document
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
me.snoty.integration.common.wiring.node.impl.MapperNodeHandlerContributor
1+
me.snoty.integration.common.wiring.node.impl.mapper.MapperNodeHandlerContributor

0 commit comments

Comments
 (0)