Skip to content

Commit b2b6aae

Browse files
authored
Add support for enum as root codec (#6)
1 parent 4d79f7f commit b2b6aae

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

core/src/main/scala/proteus/ProtobufCodec.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ object ProtobufCodec {
506506
case c: Message[_] => handleMessage(c, registers, offset)
507507
case c: RecursiveMessage[_] => handleMessage(c.codec, registers, offset)
508508
case c: Transform[_, _] => c.from(loop(c.codec, offset))
509+
case c: Enum[_] => c.valuesByIndex(input.readEnum())
509510
case _ => throw new Exception(s"Invalid root codec: $codec")
510511
}
511512

core/src/test/scala/proteus/ProtobufCodecSpec.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,23 @@ object ProtobufCodecSpec extends ZIOSpecDefault {
9292

9393
assert(results.map(_.status))(equalTo(variants))
9494
},
95+
test("enum as root codec encoding/decoding") {
96+
enum Status derives Schema { case Active, Inactive, Pending }
97+
98+
// Create a direct codec for the enum (this tests the new Enum case in loop function)
99+
val enumCodec = Schema[Status].derive(deriver)
100+
101+
val testCases = List(Status.Active, Status.Inactive, Status.Pending)
102+
103+
val results = testCases.map { enumValue =>
104+
val encoded = enumCodec.encode(enumValue)
105+
val decoded = enumCodec.decode(encoded)
106+
decoded == enumValue
107+
}
108+
109+
// Verify all enum values can be used as root codec
110+
assert(results.forall(identity))(isTrue)
111+
},
95112
test("oneOf field variants") {
96113
enum ContactInfo derives Schema {
97114
case Email(address: String)

0 commit comments

Comments
 (0)