Skip to content

Commit 41c30dc

Browse files
authored
feat(library)!: change all enums to sealed classes to allow specifying custom values (#2340)
Part of #1578.
1 parent 3906965 commit 41c30dc

11 files changed

Lines changed: 530 additions & 305 deletions

File tree

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

Lines changed: 362 additions & 96 deletions
Large diffs are not rendered by default.

github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/domain/AbstractResult.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,20 @@ public abstract class AbstractResult internal constructor(
99

1010
override fun toString(): String = value
1111

12-
public enum class Status {
13-
Success,
14-
Failure,
15-
Cancelled,
16-
Skipped,
17-
;
12+
public sealed class Status(
13+
public val name: String,
14+
) {
15+
public object Success : Status(name = "success")
16+
17+
public object Failure : Status(name = "failure")
18+
19+
public object Cancelled : Status(name = "cancelled")
20+
21+
public object Skipped : Status(name = "skipped")
22+
23+
public data class Custom(
24+
val value: String,
25+
) : Status(name = value)
1826

1927
override fun toString(): String = "'${name.lowercase()}'"
2028
}

github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/domain/Workflow.kt

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,54 @@ public data class Workflow(
2323
* @see <a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions">GitHub</a>
2424
*/
2525
@Suppress("MaxLineLength")
26-
public enum class Permission(
26+
public sealed class Permission(
2727
public val value: String,
2828
) {
29-
Actions("actions"),
30-
Checks("checks"),
31-
Contents("contents"),
32-
Deployments("deployments"),
33-
Discussions("discussions"),
34-
IdToken("id-token"),
35-
Issues("issues"),
36-
Packages("packages"),
37-
Pages("pages"),
38-
PullRequests("pull-requests"),
39-
RepositoryProjects("repository-projects"),
40-
SecurityEvents("security-events"),
41-
Statuses("statuses"),
29+
public object Actions : Permission("actions")
30+
31+
public object Checks : Permission("checks")
32+
33+
public object Contents : Permission("contents")
34+
35+
public object Deployments : Permission("deployments")
36+
37+
public object Discussions : Permission("discussions")
38+
39+
public object IdToken : Permission("id-token")
40+
41+
public object Issues : Permission("issues")
42+
43+
public object Packages : Permission("packages")
44+
45+
public object Pages : Permission("pages")
46+
47+
public object PullRequests : Permission("pull-requests")
48+
49+
public object RepositoryProjects : Permission("repository-projects")
50+
51+
public object SecurityEvents : Permission("security-events")
52+
53+
public object Statuses : Permission("statuses")
54+
55+
public data class Custom(
56+
val name: String,
57+
) : Permission(value = name)
4258
}
4359

4460
/**
4561
* @see <a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions">GitHub</a>
4662
*/
4763
@Suppress("MaxLineLength")
48-
public enum class Mode(
64+
public sealed class Mode(
4965
public val value: String,
5066
) {
51-
Read("read"),
52-
Write("write"),
53-
None("none"),
67+
public object Read : Mode("read")
68+
69+
public object Write : Mode("write")
70+
71+
public object None : Mode("none")
72+
73+
public data class Custom(
74+
val name: String,
75+
) : Mode(value = name)
5476
}
Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.typesafegithub.workflows.domain.triggers
22

3-
import io.github.typesafegithub.workflows.internal.CaseEnumSerializer
43
import kotlinx.serialization.Contextual
54
import kotlinx.serialization.InternalSerializationApi
65
import kotlinx.serialization.Serializable
@@ -23,31 +22,50 @@ public data class PullRequest(
2322
}
2423
}
2524

26-
@InternalSerializationApi
27-
internal class Serializer : CaseEnumSerializer<EventType>(EventType::class.qualifiedName!!, EventType.values())
28-
2925
/**
3026
* https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
3127
*/
3228
@OptIn(InternalSerializationApi::class)
33-
@Serializable(with = Serializer::class)
34-
public enum class EventType {
35-
Assigned,
36-
Unassigned,
37-
Labeled,
38-
Unlabeled,
39-
Opened,
40-
Edited,
41-
Closed,
42-
Reopened,
43-
Synchronize,
44-
ConvertedToDraft,
45-
ReadyForReview,
46-
Locked,
47-
Unlocked,
48-
ReviewRequested,
49-
ReviewRequestRemoved,
50-
AutoMergeEnabled,
51-
AutoMergeDisabled,
29+
@Serializable
30+
public sealed class EventType(
31+
public val name: String,
32+
) {
33+
public object Assigned : EventType("assigned")
34+
35+
public object Unassigned : EventType("unassigned")
36+
37+
public object Labeled : EventType("labeled")
38+
39+
public object Unlabeled : EventType("unlabeled")
40+
41+
public object Opened : EventType("opened")
42+
43+
public object Edited : EventType("edited")
44+
45+
public object Closed : EventType("closed")
46+
47+
public object Reopened : EventType("reopened")
48+
49+
public object Synchronize : EventType("synchronized")
50+
51+
public object ConvertedToDraft : EventType("convert_to_draft")
52+
53+
public object ReadyForReview : EventType("ready_for_review")
54+
55+
public object Locked : EventType("locked")
56+
57+
public object Unlocked : EventType("unlocked")
58+
59+
public object ReviewRequested : EventType("review_requested")
60+
61+
public object ReviewRequestRemoved : EventType("review_request_removed")
62+
63+
public object AutoMergeEnabled : EventType("auto_merge")
64+
65+
public object AutoMergeDisabled : EventType("auto_merge_disabled")
66+
67+
public data class Custom(
68+
val value: String,
69+
) : EventType(name = value)
5270
}
5371
}
Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.typesafegithub.workflows.domain.triggers
22

3-
import io.github.typesafegithub.workflows.internal.CaseEnumSerializer
43
import kotlinx.serialization.Contextual
54
import kotlinx.serialization.InternalSerializationApi
65
import kotlinx.serialization.Serializable
@@ -24,28 +23,47 @@ public data class PullRequestTarget(
2423
}
2524
}
2625

27-
@InternalSerializationApi
28-
internal class Serializer : CaseEnumSerializer<EventType>(EventType::class.qualifiedName!!, EventType.values())
29-
3026
@OptIn(InternalSerializationApi::class)
31-
@Serializable(with = Serializer::class)
32-
public enum class EventType {
33-
Assigned,
34-
Unassigned,
35-
Labeled,
36-
Unlabeled,
37-
Opened,
38-
Edited,
39-
Closed,
40-
Reopened,
41-
Synchronize,
42-
ConvertedToDraft,
43-
ReadyForReview,
44-
Locked,
45-
Unlocked,
46-
ReviewRequested,
47-
ReviewRequestRemoved,
48-
AutoMergeEnabled,
49-
AutoMergeDisabled,
27+
@Serializable
28+
public sealed class EventType(
29+
public val name: String,
30+
) {
31+
public object Assigned : EventType("assigned")
32+
33+
public object Unassigned : EventType("unassigned")
34+
35+
public object Labeled : EventType("labeled")
36+
37+
public object Unlabeled : EventType("unlabeled")
38+
39+
public object Opened : EventType("opened")
40+
41+
public object Edited : EventType("edited")
42+
43+
public object Closed : EventType("closed")
44+
45+
public object Reopened : EventType("reopened")
46+
47+
public object Synchronize : EventType("synchronize")
48+
49+
public object ConvertedToDraft : EventType("convert_to_draft")
50+
51+
public object ReadyForReview : EventType("ready_for_review")
52+
53+
public object Locked : EventType("locked")
54+
55+
public object Unlocked : EventType("unlocked")
56+
57+
public object ReviewRequested : EventType("review_requested")
58+
59+
public object ReviewRequestRemoved : EventType("review_request_removed")
60+
61+
public object AutoMergeEnabled : EventType("auto_merge_enabled")
62+
63+
public object AutoMergeDisabled : EventType("auto_merge_disabled")
64+
65+
public data class Custom(
66+
val value: String,
67+
) : EventType(name = value)
5068
}
5169
}

github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/domain/triggers/WorkflowCall.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.github.typesafegithub.workflows.domain.triggers
22

3+
import io.github.typesafegithub.workflows.domain.triggers.PullRequestTarget.EventType
34
import kotlinx.serialization.Contextual
4-
import kotlinx.serialization.SerialName
55
import kotlinx.serialization.Serializable
66

77
/**
@@ -22,15 +22,22 @@ public data class WorkflowCall(
2222
public val default: String? = null,
2323
) {
2424
@Serializable
25-
public enum class Type {
26-
@SerialName("boolean")
27-
Boolean,
25+
public sealed class Type(
26+
public val name: kotlin.String,
27+
) {
28+
public object Choice : Type("choice")
2829

29-
@SerialName("number")
30-
Number,
30+
public object Environment : Type("environment")
3131

32-
@SerialName("string")
33-
String,
32+
public object Boolean : Type("boolean")
33+
34+
public object Number : Type("number")
35+
36+
public object String : Type("string")
37+
38+
public data class Custom(
39+
val value: kotlin.String,
40+
) : EventType(name = value)
3441
}
3542
}
3643

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.github.typesafegithub.workflows.domain.triggers
22

3+
import io.github.typesafegithub.workflows.domain.triggers.PullRequestTarget.EventType
34
import kotlinx.serialization.Contextual
4-
import kotlinx.serialization.SerialName
55
import kotlinx.serialization.Serializable
66

77
// https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_dispatchinputs
@@ -19,21 +19,22 @@ public data class WorkflowDispatch(
1919
public val default: String? = null,
2020
) {
2121
@Serializable
22-
public enum class Type {
23-
@SerialName("choice")
24-
Choice,
22+
public sealed class Type(
23+
public val name: kotlin.String,
24+
) {
25+
public object Choice : Type("choice")
2526

26-
@SerialName("environment")
27-
Environment,
27+
public object Environment : Type("environment")
2828

29-
@SerialName("boolean")
30-
Boolean,
29+
public object Boolean : Type("boolean")
3130

32-
@SerialName("number")
33-
Number,
31+
public object Number : Type("number")
3432

35-
@SerialName("string")
36-
String,
33+
public object String : Type("string")
34+
35+
public data class Custom(
36+
val value: kotlin.String,
37+
) : EventType(name = value)
3738
}
3839
}
3940
}

0 commit comments

Comments
 (0)