All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.s2.dsl.automate.builder.S2AutomateBuilder.kt Maven / Gradle / Ivy

package s2.dsl.automate.builder

import f2.dsl.cqrs.Message
import s2.dsl.automate.S2Automate
import s2.dsl.automate.S2InitCommand
import s2.dsl.automate.S2SubMachine
import s2.dsl.automate.S2Transition
import kotlin.js.JsExport
import kotlin.js.JsName

class S2AutomateBuilder {
	lateinit var name: String
	val transactions = mutableListOf()
	val subMachines = mutableListOf()

	inline fun  init(exec: S2InitTransitionBuilder.() -> Unit) {
		val builder = S2InitTransitionBuilder()
		builder.exec()
		S2Transition(
			to = builder.to,
			role = builder.role,
			msg = CMD::class,
			from = null
		).let(transactions::add)
	}

	inline fun  transaction(exec: S2TransitionBuilder.() -> Unit) {
		val builder = S2TransitionBuilder()
		builder.exec()
		S2Transition(
			from = builder.from,
			to = builder.to,
			role = builder.role,
			msg = CMD::class,
		).let(transactions::add)
	}

	inline fun  selfTransaction(exec: S2SelfTransitionBuilder.() -> Unit) {
		val builder = S2SelfTransitionBuilder()
		builder.exec()
		builder.states.map { state ->
			S2Transition(
				from = state,
				to = state,
				role = builder.role,
				msg = CMD::class,
			)
		}.forEach(transactions::add)
	}

	fun node(exec: S2NodeBuilder.() -> Unit) {
		val builder = S2NodeBuilder()
		builder.exec()
		transactions.addAll(builder.transactions)
	}

	fun submachine(exec: S2SubMachineBuilder.() -> Unit) {
		val builder = S2SubMachineBuilder()
		builder.exec()
		S2SubMachine(
			automate = builder.automate,
			startsOn = builder.startsOn,
			endsOn = builder.endsOn,
			autostart = builder.autostart,
			blocking = builder.blocking,
			singleton = builder.singleton
		).let(subMachines::add)
	}
}

@JsExport
@JsName("s2")
fun s2(exec: S2AutomateBuilder.() -> Unit): S2Automate {
	val builder = S2AutomateBuilder()
	builder.exec()
	return S2Automate(
		name = builder.name,
		transitions = builder.transactions.toTypedArray(),
		subMachines = builder.subMachines.toTypedArray()
	)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy