From 28ccd490c182c1cfa5db118516b69dea6085a439 Mon Sep 17 00:00:00 2001
From: Andrew Golovashevich <landgrafhomyak@gmail.com>
Date: Thu, 9 Jan 2025 01:22:02 +0300
Subject: [PATCH] Runtime expression builder

---
 .../serdha/api/v0/misc/RuntimeExpression.kt   | 41 +++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt

diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt
new file mode 100644
index 0000000..ce88db5
--- /dev/null
+++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/misc/RuntimeExpression.kt
@@ -0,0 +1,41 @@
+package ru.landgrafhomyak.serdha.api.v0.misc
+
+import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter
+import ru.landgrafhomyak.serdha.api.v0.runtime.Row
+
+public interface RuntimeExpression<ExpressionUserExtension : Any> {
+	public val userExtension: ExpressionUserExtension
+
+	public interface RuntimeExpressionInput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : Column<RT, DT, ExpressionUserExtension>
+	public interface RuntimeExpressionOutput<RT, DT : DatabaseType<RT>, ExpressionUserExtension : Any> : InputParam<RT, DT, ExpressionUserExtension>
+
+	public fun interface InputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
+		public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
+
+		public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
+			public operator fun <RT, DT : DatabaseType<RT>> set(p: RuntimeExpressionInput<RT, DT, ExpressionUserExtension>, e: Expression<RT, DT, QueryUserExtension>)
+		}
+	}
+
+	public fun interface OutputLinker<ExpressionUserExtension : Any, QueryUserExtension : Any> {
+		public fun link(linker: Scope<ExpressionUserExtension, QueryUserExtension>)
+
+		public interface Scope<ExpressionUserExtension : Any, QueryUserExtension : Any> {
+			public operator fun <RT, DT : DatabaseType<RT>> get(p: RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>): Expression<RT, DT, QueryUserExtension>
+		}
+	}
+
+	public interface Creator<ExpressionUserExtension : Any> {
+		public fun createExpression(creator: Scope<ExpressionUserExtension>): ExpressionUserExtension
+
+		public interface Scope<ExpressionUserExtension : Any> {
+			public fun <RT, DT : DatabaseType<RT>> input(name: String, type: DT): RuntimeExpressionInput<RT, DT, ExpressionUserExtension>
+			public fun <RT, DT : DatabaseType<RT>> output(name: String, type: DT): RuntimeExpressionOutput<RT, DT, ExpressionUserExtension>
+			public var action: Action<ExpressionUserExtension>
+		}
+	}
+
+	public interface Action<ExpressionUserExtension : Any> {
+		public fun calculate(input: Row<ExpressionUserExtension>, output: ParametersSetter<ExpressionUserExtension>)
+	}
+}
\ No newline at end of file