Skip to content

Commit b3b55d7

Browse files
authored
feat(abg): create enum for binding generation modes (#1321)
Part of #1318. Thanks to this, we'll be able to define yet another mode, optimized for hosting the JARs with bindings by a dedicated service.
1 parent d58ef39 commit b3b55d7

File tree

4 files changed

+46
-17
lines changed

4 files changed

+46
-17
lines changed

action-binding-generator/api/action-binding-generator.api

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ public final class io/github/typesafegithub/workflows/actionbindinggenerator/gen
8181
public fun toString ()Ljava/lang/String;
8282
}
8383

84+
public final class io/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType : java/lang/Enum {
85+
public static final field BUNDLED_WITH_LIB Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;
86+
public static final field CLIENT_SIDE_GENERATION Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;
87+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
88+
public static fun valueOf (Ljava/lang/String;)Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;
89+
public static fun values ()[Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;
90+
}
91+
8492
public final class io/github/typesafegithub/workflows/actionbindinggenerator/generation/ExtractUsedActionsFromWorkflowKt {
8593
public static final fun extractUsedActionsFromWorkflow (Ljava/lang/String;)Ljava/util/List;
8694
}
@@ -90,8 +98,8 @@ public final class io/github/typesafegithub/workflows/actionbindinggenerator/gen
9098
}
9199

92100
public final class io/github/typesafegithub/workflows/actionbindinggenerator/generation/GenerationKt {
93-
public static final fun generateBinding (Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/ActionCoords;Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/MetadataRevision;Lio/github/typesafegithub/workflows/actionbindinggenerator/metadata/Metadata;Lkotlin/Pair;Z)Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ActionBinding;
94-
public static synthetic fun generateBinding$default (Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/ActionCoords;Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/MetadataRevision;Lio/github/typesafegithub/workflows/actionbindinggenerator/metadata/Metadata;Lkotlin/Pair;ZILjava/lang/Object;)Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ActionBinding;
101+
public static final fun generateBinding (Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/ActionCoords;Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/MetadataRevision;Lio/github/typesafegithub/workflows/actionbindinggenerator/metadata/Metadata;Lkotlin/Pair;Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;)Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ActionBinding;
102+
public static synthetic fun generateBinding$default (Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/ActionCoords;Lio/github/typesafegithub/workflows/actionbindinggenerator/domain/MetadataRevision;Lio/github/typesafegithub/workflows/actionbindinggenerator/metadata/Metadata;Lkotlin/Pair;Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ClientType;ILjava/lang/Object;)Lio/github/typesafegithub/workflows/actionbindinggenerator/generation/ActionBinding;
95103
}
96104

97105
public final class io/github/typesafegithub/workflows/actionbindinggenerator/metadata/Input {

action-binding-generator/src/main/kotlin/io/github/typesafegithub/workflows/actionbindinggenerator/generation/GenerateActionBindingsCliHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public fun generateActionBindings(
4949
val binding =
5050
action.generateBinding(
5151
metadataRevision = NewestForVersion,
52-
generateForScript = true,
52+
clientType = ClientType.CLIENT_SIDE_GENERATION,
5353
)
5454
it.toFile().writeText(binding.kotlinCode)
5555
}

action-binding-generator/src/main/kotlin/io/github/typesafegithub/workflows/actionbindinggenerator/generation/Generation.kt

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ public data class ActionBinding(
4444
val typingActualSource: TypingActualSource?,
4545
)
4646

47+
public enum class ClientType {
48+
/**
49+
* The binding is going to be bundled with the library.
50+
*/
51+
BUNDLED_WITH_LIB,
52+
53+
/**
54+
* The binding is going to be generated on the client side, and consumed
55+
* via `@file:Import(...)`.
56+
*/
57+
CLIENT_SIDE_GENERATION,
58+
}
59+
4760
private object Types {
4861
val mapStringString = Map::class.asTypeName().parameterizedBy(String::class.asTypeName(), String::class.asTypeName())
4962
val nullableString = String::class.asTypeName().copy(nullable = true)
@@ -60,7 +73,7 @@ public fun ActionCoords.generateBinding(
6073
metadataRevision: MetadataRevision,
6174
metadata: Metadata = this.fetchMetadata(metadataRevision),
6275
inputTypings: Pair<Map<String, Typing>, TypingActualSource?> = provideTypes(metadataRevision),
63-
generateForScript: Boolean = false,
76+
clientType: ClientType = ClientType.BUNDLED_WITH_LIB,
6477
): ActionBinding {
6578
require(this.version.removePrefix("v").toIntOrNull() != null) {
6679
"Only major versions are supported, and '${this.version}' was given!"
@@ -71,9 +84,9 @@ public fun ActionCoords.generateBinding(
7184
println("$prettyPrint I suggest the following typings:\n$formatSuggestions")
7285
}
7386

74-
val className = this.buildActionClassName(includeVersion = !generateForScript)
87+
val className = this.buildActionClassName(includeVersion = clientType == ClientType.BUNDLED_WITH_LIB)
7588
val actionBindingSourceCode =
76-
generateActionBindingSourceCode(metadataProcessed, this, inputTypings.first, className, generateForScript = generateForScript)
89+
generateActionBindingSourceCode(metadataProcessed, this, inputTypings.first, className, clientType)
7790
val packageName = owner.toKotlinPackageName()
7891
return ActionBinding(
7992
kotlinCode = actionBindingSourceCode,
@@ -101,11 +114,15 @@ private fun generateActionBindingSourceCode(
101114
coords: ActionCoords,
102115
inputTypings: Map<String, Typing>,
103116
className: String,
104-
generateForScript: Boolean,
117+
clientType: ClientType,
105118
): String {
106119
val fileSpec =
107120
FileSpec.builder(
108-
if (generateForScript) "" else "io.github.typesafegithub.workflows.actions.${coords.owner.toKotlinPackageName()}",
121+
if (clientType == ClientType.BUNDLED_WITH_LIB) {
122+
"io.github.typesafegithub.workflows.actions.${coords.owner.toKotlinPackageName()}"
123+
} else {
124+
""
125+
},
109126
className,
110127
)
111128
.addFileComment(
@@ -115,14 +132,14 @@ private fun generateActionBindingSourceCode(
115132
See https://github.com/typesafegithub/github-workflows-kt for more info.
116133
""".trimIndent(),
117134
)
118-
.addType(generateActionClass(metadata, coords, inputTypings, className, generateForScript = generateForScript))
135+
.addType(generateActionClass(metadata, coords, inputTypings, className, clientType))
119136
.addSuppressAnnotation(metadata, coords)
120137
.indent(" ")
121138
.build()
122139
return buildString {
123140
fileSpec.writeTo(this)
124141
}.let {
125-
if (generateForScript) {
142+
if (clientType == ClientType.CLIENT_SIDE_GENERATION) {
126143
it.lines()
127144
.filter { !it.startsWith("import io.github.typesafegithub.workflows.actions.") }
128145
.joinToString(separator = "\n")
@@ -157,18 +174,18 @@ private fun generateActionClass(
157174
coords: ActionCoords,
158175
inputTypings: Map<String, Typing>,
159176
className: String,
160-
generateForScript: Boolean,
177+
clientType: ClientType,
161178
): TypeSpec {
162179
return TypeSpec.classBuilder(className)
163180
.addModifiers(KModifier.DATA)
164181
.apply {
165-
if (generateForScript) {
182+
if (clientType == ClientType.CLIENT_SIDE_GENERATION) {
166183
addExperimentalAnnotation()
167184
}
168185
}
169186
.addKdoc(actionKdoc(metadata, coords))
170187
.addMaybeDeprecated(coords)
171-
.inheritsFromRegularAction(coords, metadata, className, generateForScript = generateForScript)
188+
.inheritsFromRegularAction(coords, metadata, className, clientType)
172189
.primaryConstructor(metadata.primaryConstructor(inputTypings, coords, className))
173190
.properties(metadata, coords, inputTypings, className)
174191
.addFunction(metadata.secondaryConstructor(inputTypings, coords, className))
@@ -332,7 +349,7 @@ private fun TypeSpec.Builder.inheritsFromRegularAction(
332349
coords: ActionCoords,
333350
metadata: Metadata,
334351
className: String,
335-
generateForScript: Boolean,
352+
clientType: ClientType,
336353
): TypeSpec.Builder {
337354
val superclass =
338355
ClassName("io.github.typesafegithub.workflows.domain.actions", "RegularAction")
@@ -341,7 +358,11 @@ private fun TypeSpec.Builder.inheritsFromRegularAction(
341358
OutputsBase
342359
} else {
343360
ClassName(
344-
if (generateForScript) "" else "io.github.typesafegithub.workflows.actions.${coords.owner.toKotlinPackageName()}",
361+
if (clientType == ClientType.BUNDLED_WITH_LIB) {
362+
"io.github.typesafegithub.workflows.actions.${coords.owner.toKotlinPackageName()}"
363+
} else {
364+
""
365+
},
345366
className,
346367
"Outputs",
347368
)

action-binding-generator/src/test/kotlin/io/github/typesafegithub/workflows/actionbindinggenerator/generation/GenerationTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ class GenerationTest : FunSpec({
388388
binding.shouldMatchFile("ActionWithInputsSharingTypeV3.kt")
389389
}
390390

391-
test("action binding generated to be used from a script") {
391+
test("action binding generated on the client side") {
392392
// given
393393
val actionManifest =
394394
Metadata(
@@ -426,7 +426,7 @@ class GenerationTest : FunSpec({
426426
coords.generateBinding(
427427
metadataRevision = FromLockfile,
428428
metadata = actionManifest,
429-
generateForScript = true,
429+
clientType = ClientType.CLIENT_SIDE_GENERATION,
430430
inputTypings =
431431
Pair(
432432
mapOf(

0 commit comments

Comments
 (0)