diff --git a/library/src/main/kotlin/it/krzeminski/githubactions/dsl/expressions/contexts/MatrixContext.kt b/library/src/main/kotlin/it/krzeminski/githubactions/dsl/expressions/contexts/MatrixContext.kt new file mode 100644 index 0000000000..4650ab6d52 --- /dev/null +++ b/library/src/main/kotlin/it/krzeminski/githubactions/dsl/expressions/contexts/MatrixContext.kt @@ -0,0 +1,21 @@ +package it.krzeminski.githubactions.dsl.expressions.contexts + +import it.krzeminski.githubactions.dsl.expressions.expr +import kotlin.reflect.KProperty + + +public open class StrategyMatrix( + private val map: MutableMap> = mutableMapOf() +): Map> by map { + + public fun iterate(vararg value: String): Property { + return Property(value.toList()) + } + + public inner class Property(public val values: List) { + public operator fun getValue(strategyMatrixContext: StrategyMatrix, property: KProperty<*>): String { + map[property.name] = values + return expr("matrix.${property.name}") + } + } +} diff --git a/library/src/test/kotlin/it/krzeminski/githubactions/dsl/expressions/MatrixExample.kt b/library/src/test/kotlin/it/krzeminski/githubactions/dsl/expressions/MatrixExample.kt new file mode 100644 index 0000000000..7b971eb4ba --- /dev/null +++ b/library/src/test/kotlin/it/krzeminski/githubactions/dsl/expressions/MatrixExample.kt @@ -0,0 +1,51 @@ +package it.krzeminski.githubactions.dsl.expressions + +import it.krzeminski.githubactions.actions.actions.SetupNodeV3 +import it.krzeminski.githubactions.domain.RunnerType +import it.krzeminski.githubactions.domain.triggers.Push +import it.krzeminski.githubactions.dsl.expressions.contexts.StrategyMatrix +import it.krzeminski.githubactions.dsl.workflow +import it.krzeminski.githubactions.yaml.toYaml +import java.nio.file.Path + +fun main() { + println(expectedWorkflow.toYaml()) +} + +val expectedWorkflow = workflow( + name = "Test matrix", + on = listOf(Push()), + sourceFile = Path.of("/tmp/some_workflow.main.kts"), +) { + val strategyMatrix = object : StrategyMatrix() { + val os by iterate("ubuntu-latest", "windows-latest") + val node by iterate("14", "16") + } + job( + id = "test_job", + name = "Test Job", + strategyMatrix = strategyMatrix, + runsOn = RunnerType.Custom(strategyMatrix.os), + ) { + uses(SetupNodeV3( + nodeVersion = strategyMatrix.node + )) + } +} + +val expectedMatrixYaml = """ +name: Test matrix +on: push + +jobs: + build: + runs-on: ${expr("matrix.os")} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + node: [14, 16] + steps: + - uses: actions/setup-node@v3 + with: + node-version: ${expr("matrix.node")} +""".trimIndent()