diff --git a/shared/src/main/scala/io/kaitai/struct/format/EnumSpec.scala b/shared/src/main/scala/io/kaitai/struct/format/EnumSpec.scala index 2794e0b85..675b9765c 100644 --- a/shared/src/main/scala/io/kaitai/struct/format/EnumSpec.scala +++ b/shared/src/main/scala/io/kaitai/struct/format/EnumSpec.scala @@ -1,5 +1,9 @@ package io.kaitai.struct.format +import io.kaitai.struct.problems.KSYParseError + +import scala.collection.mutable + case class EnumSpec(map: Map[Long, EnumValueSpec]) { var name = List[String]() @@ -19,10 +23,18 @@ case class EnumSpec(map: Map[Long, EnumValueSpec]) { object EnumSpec { def fromYaml(src: Any, path: List[String]): EnumSpec = { val srcMap = ParseUtils.asMap(src, path) + val memberNameMap = mutable.Map[String, Long]() EnumSpec(srcMap.map { case (id, desc) => val idLong = ParseUtils.asLong(id, path) val value = EnumValueSpec.fromYaml(desc, path ++ List(idLong.toString)) + memberNameMap.get(value.name).foreach { (prevIdLong) => + throw KSYParseError.withText( + s"duplicate enum member ID: '${value.name}', previously defined at /${(path ++ List(prevIdLong.toString)).mkString("/")}", + path ++ List(idLong.toString) + ) + } + memberNameMap.put(value.name, idLong) idLong -> value }) }