Skip to content

Commit 50dbba1

Browse files
authored
feat(library): add properties to WorkflowCall trigger (#1788)
Closes #614.
1 parent 77b8f38 commit 50dbba1

File tree

4 files changed

+269
-5
lines changed

4 files changed

+269
-5
lines changed

github-workflows-kt/api/github-workflows-kt.api

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,12 +1692,18 @@ public final class io/github/typesafegithub/workflows/domain/triggers/Watch$Comp
16921692
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall : io/github/typesafegithub/workflows/domain/triggers/Trigger {
16931693
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Companion;
16941694
public fun <init> ()V
1695-
public fun <init> (Ljava/util/Map;)V
1696-
public synthetic fun <init> (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1695+
public fun <init> (Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V
1696+
public synthetic fun <init> (Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
16971697
public final fun component1 ()Ljava/util/Map;
1698-
public final fun copy (Ljava/util/Map;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;
1699-
public static synthetic fun copy$default (Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;Ljava/util/Map;ILjava/lang/Object;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;
1698+
public final fun component2 ()Ljava/util/Map;
1699+
public final fun component3 ()Ljava/util/Map;
1700+
public final fun component4 ()Ljava/util/Map;
1701+
public final fun copy (Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;
1702+
public static synthetic fun copy$default (Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall;
17001703
public fun equals (Ljava/lang/Object;)Z
1704+
public final fun getInputs ()Ljava/util/Map;
1705+
public final fun getOutputs ()Ljava/util/Map;
1706+
public final fun getSecrets ()Ljava/util/Map;
17011707
public fun get_customArguments ()Ljava/util/Map;
17021708
public fun hashCode ()I
17031709
public fun toString ()Ljava/lang/String;
@@ -1717,6 +1723,86 @@ public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCa
17171723
public final fun serializer ()Lkotlinx/serialization/KSerializer;
17181724
}
17191725

1726+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input {
1727+
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input$Companion;
1728+
public fun <init> (Ljava/lang/String;ZLio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;Ljava/lang/String;)V
1729+
public synthetic fun <init> (Ljava/lang/String;ZLio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1730+
public final fun getDefault ()Ljava/lang/String;
1731+
public final fun getDescription ()Ljava/lang/String;
1732+
public final fun getRequired ()Z
1733+
public final fun getType ()Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1734+
}
1735+
1736+
public synthetic class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
1737+
public static final field INSTANCE Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input$$serializer;
1738+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
1739+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input;
1740+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
1741+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
1742+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input;)V
1743+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
1744+
}
1745+
1746+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Input$Companion {
1747+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
1748+
}
1749+
1750+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output {
1751+
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output$Companion;
1752+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
1753+
public final fun getDescription ()Ljava/lang/String;
1754+
public final fun getValue ()Ljava/lang/String;
1755+
}
1756+
1757+
public synthetic class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
1758+
public static final field INSTANCE Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output$$serializer;
1759+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
1760+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output;
1761+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
1762+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
1763+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output;)V
1764+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
1765+
}
1766+
1767+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Output$Companion {
1768+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
1769+
}
1770+
1771+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret {
1772+
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret$Companion;
1773+
public fun <init> (Ljava/lang/String;Z)V
1774+
public final fun getDescription ()Ljava/lang/String;
1775+
public final fun getRequired ()Z
1776+
}
1777+
1778+
public synthetic class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
1779+
public static final field INSTANCE Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret$$serializer;
1780+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
1781+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret;
1782+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
1783+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
1784+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret;)V
1785+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
1786+
}
1787+
1788+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Secret$Companion {
1789+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
1790+
}
1791+
1792+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type : java/lang/Enum {
1793+
public static final field Boolean Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1794+
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type$Companion;
1795+
public static final field Number Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1796+
public static final field String Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1797+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
1798+
public static fun valueOf (Ljava/lang/String;)Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1799+
public static fun values ()[Lio/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type;
1800+
}
1801+
1802+
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowCall$Type$Companion {
1803+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
1804+
}
1805+
17201806
public final class io/github/typesafegithub/workflows/domain/triggers/WorkflowDispatch : io/github/typesafegithub/workflows/domain/triggers/Trigger {
17211807
public static final field Companion Lio/github/typesafegithub/workflows/domain/triggers/WorkflowDispatch$Companion;
17221808
public fun <init> ()V
Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
11
package io.github.typesafegithub.workflows.domain.triggers
22

33
import kotlinx.serialization.Contextual
4+
import kotlinx.serialization.SerialName
45
import kotlinx.serialization.Serializable
56

67
/**
78
* https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_call
89
*/
910
@Serializable
1011
public data class WorkflowCall(
12+
val inputs: Map<String, Input> = emptyMap(),
13+
val outputs: Map<String, Output> = emptyMap(),
14+
val secrets: Map<String, Secret> = emptyMap(),
1115
override val _customArguments: Map<String, @Contextual Any> = mapOf(),
12-
) : Trigger()
16+
) : Trigger() {
17+
@Serializable
18+
public enum class Type {
19+
@SerialName("boolean")
20+
Boolean,
21+
22+
@SerialName("number")
23+
Number,
24+
25+
@SerialName("string")
26+
String,
27+
}
28+
29+
@Serializable
30+
public class Input(
31+
public val description: String,
32+
public val required: Boolean,
33+
public val type: Type,
34+
public val default: String? = null,
35+
)
36+
37+
@Serializable
38+
public class Output(
39+
public val description: String,
40+
public val value: String,
41+
)
42+
43+
@Serializable
44+
public class Secret(
45+
public val description: String,
46+
public val required: Boolean,
47+
)
48+
}

github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/TriggersToYaml.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ private fun Trigger.toAdditionalYaml(): Any? =
144144
when (this) {
145145
is Schedule -> toAdditionalYaml()
146146
is WorkflowDispatch -> toAdditionalYaml()
147+
is WorkflowCall -> toAdditionalYaml()
147148
else -> null
148149
}
149150

@@ -166,3 +167,34 @@ private fun WorkflowDispatch.Input.toYaml(): Map<String, Any> =
166167
"default" to default,
167168
"options" to options.ifEmpty { null },
168169
)
170+
171+
private fun WorkflowCall.toAdditionalYaml(): Map<String, Any?> =
172+
when {
173+
inputs.isEmpty() -> emptyMap()
174+
else ->
175+
mapOf(
176+
"inputs" to inputs.mapValues { (_, value) -> value.toYaml() },
177+
"outputs" to outputs.mapValues { (_, value) -> value.toYaml() },
178+
"secrets" to secrets.mapValues { (_, value) -> value.toYaml() },
179+
)
180+
}
181+
182+
private fun WorkflowCall.Input.toYaml(): Map<String, Any> =
183+
mapOfNotNullValues(
184+
"description" to description,
185+
"type" to type.toSnakeCase(),
186+
"required" to required,
187+
"default" to default,
188+
)
189+
190+
private fun WorkflowCall.Output.toYaml(): Map<String, Any> =
191+
mapOfNotNullValues(
192+
"description" to description,
193+
"value" to value,
194+
)
195+
196+
private fun WorkflowCall.Secret.toYaml(): Map<String, Any> =
197+
mapOfNotNullValues(
198+
"description" to description,
199+
"required" to required,
200+
)

github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/yaml/TriggersToYamlTest.kt

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.github.typesafegithub.workflows.domain.triggers.PullRequestTarget
66
import io.github.typesafegithub.workflows.domain.triggers.Push
77
import io.github.typesafegithub.workflows.domain.triggers.Schedule
88
import io.github.typesafegithub.workflows.domain.triggers.Trigger
9+
import io.github.typesafegithub.workflows.domain.triggers.WorkflowCall
910
import io.github.typesafegithub.workflows.domain.triggers.WorkflowDispatch
1011
import io.kotest.core.spec.style.DescribeSpec
1112
import io.kotest.matchers.shouldBe
@@ -125,6 +126,115 @@ class TriggersToYamlTest :
125126
}
126127
}
127128

129+
describe("workflow call") {
130+
it("renders without parameters") {
131+
// given
132+
val triggers = listOf(WorkflowCall())
133+
134+
// when
135+
val yaml = triggers.triggersToYaml()
136+
137+
// then
138+
yaml shouldBe
139+
mapOf(
140+
"workflow_call" to emptyMap<Any, Any>(),
141+
)
142+
}
143+
144+
it("renders with all parameters") {
145+
// given
146+
val triggers =
147+
listOf(
148+
WorkflowCall(
149+
inputs =
150+
mapOf(
151+
"tags" to
152+
WorkflowCall.Input(
153+
description = "Test scenario tags",
154+
type = WorkflowCall.Type.Boolean,
155+
required = false,
156+
),
157+
"retries" to
158+
WorkflowCall.Input(
159+
description = "How many retries",
160+
type = WorkflowCall.Type.Number,
161+
required = false,
162+
),
163+
"greeting" to
164+
WorkflowCall.Input(
165+
description = "Hello {greeting}",
166+
type = WorkflowCall.Type.String,
167+
required = true,
168+
),
169+
),
170+
outputs =
171+
mapOf(
172+
"some-output" to
173+
WorkflowCall.Output(
174+
description = "Cool output",
175+
value = "{{foobar}}",
176+
),
177+
),
178+
secrets =
179+
mapOf(
180+
"top-secret" to
181+
WorkflowCall.Secret(
182+
description = "Cloud key",
183+
required = true,
184+
),
185+
),
186+
),
187+
)
188+
189+
// when
190+
val yaml = triggers.triggersToYaml()
191+
192+
// then
193+
yaml shouldBe
194+
mapOf(
195+
"workflow_call" to
196+
mapOf(
197+
"inputs" to
198+
mapOf(
199+
"tags" to
200+
mapOf(
201+
"description" to "Test scenario tags",
202+
"type" to "boolean",
203+
"required" to false,
204+
),
205+
"retries" to
206+
mapOf(
207+
"description" to "How many retries",
208+
"type" to "number",
209+
"required" to false,
210+
),
211+
"greeting" to
212+
mapOf(
213+
"description" to "Hello {greeting}",
214+
"type" to "string",
215+
"required" to true,
216+
),
217+
),
218+
"outputs" to
219+
mapOf(
220+
"some-output" to
221+
mapOf(
222+
"description" to "Cool output",
223+
"value" to "{{foobar}}",
224+
),
225+
),
226+
"secrets" to
227+
mapOf(
228+
"top-secret" to
229+
mapOf(
230+
"description" to "Cloud key",
231+
"required" to true,
232+
),
233+
),
234+
),
235+
)
236+
}
237+
}
128238
describe("push") {
129239
it("renders without parameters") {
130240
// given

0 commit comments

Comments
 (0)