Skip to content

Commit 1cbaff9

Browse files
committed
Prohibit duplicate enum member IDs (names)
Silently allowing duplicate enum member IDs causes problems in real formats, see - kaitai-io/kaitai_struct_formats#345 - kaitai-io/kaitai_struct_formats#346 - kaitai-io/kaitai_struct_formats#421 (comment) - kaitai-io/kaitai_struct_formats#448
1 parent 0a3dcbf commit 1cbaff9

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

shared/src/main/scala/io/kaitai/struct/format/EnumSpec.scala

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.kaitai.struct.format
22

3+
import io.kaitai.struct.problems.KSYParseError
4+
5+
import scala.collection.mutable
6+
37
case class EnumSpec(map: Map[Long, EnumValueSpec]) {
48
var name = List[String]()
59

@@ -19,10 +23,18 @@ case class EnumSpec(map: Map[Long, EnumValueSpec]) {
1923
object EnumSpec {
2024
def fromYaml(src: Any, path: List[String]): EnumSpec = {
2125
val srcMap = ParseUtils.asMap(src, path)
26+
val memberNameMap = mutable.Map[String, Long]()
2227
EnumSpec(srcMap.map { case (id, desc) =>
2328
val idLong = ParseUtils.asLong(id, path)
2429
val value = EnumValueSpec.fromYaml(desc, path ++ List(idLong.toString))
2530

31+
memberNameMap.get(value.name).foreach { (prevIdLong) =>
32+
throw KSYParseError.withText(
33+
s"duplicate enum member ID: '${value.name}', previously defined at /${(path ++ List(prevIdLong.toString)).mkString("/")}",
34+
path ++ List(idLong.toString)
35+
)
36+
}
37+
memberNameMap.put(value.name, idLong)
2638
idLong -> value
2739
})
2840
}

0 commit comments

Comments
 (0)