Skip to content

Commit 61d96c3

Browse files
committed
Store original form of ValidateEq. Rename ValidateEq to ValidateEquals and make it abstract
Fixed (1): [info] - expr_field_unknown_valid_eq_short *** FAILED *** [info] [expr_field_unknown_valid_eq_short.ksy: /seq/0/valid/eq: [info] error: unable to access 'bar' in expr_field_unknown_valid_eq_short context [info] ] [info] did not equal [info] [expr_field_unknown_valid_eq_short.ksy: /seq/0/valid: [info] error: unable to access 'bar' in expr_field_unknown_valid_eq_short context [info] ] (SimpleMatchers.scala:34)
1 parent 8792049 commit 61d96c3

4 files changed

Lines changed: 42 additions & 26 deletions

File tree

shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ class GraphvizClassCompiler(classSpecs: ClassSpecs, topClass: ClassSpec) extends
182182
val text = valid match {
183183
case Some(v) =>
184184
v match {
185-
case ValidationEq(expected) =>
186-
s"must be equal to ${expression(expected, fullPortName, STYLE_EDGE_VALID)}"
185+
case expected: ValidationEquals =>
186+
s"must be equal to ${expression(expected.value, fullPortName, STYLE_EDGE_VALID)}"
187187
case ValidationMin(min) =>
188188
s"must be at least ${expression(min, fullPortName, STYLE_EDGE_VALID)}"
189189
case ValidationMax(max) =>
@@ -517,12 +517,17 @@ object GraphvizClassCompiler extends LanguageCompilerStatic {
517517

518518
private def fixedBytes(blt: BytesLimitType, valid: Option[ValidationSpec]): Option[String] = {
519519
valid match {
520-
case Some(ValidationEq(Ast.expr.List(contents)))
521-
if blt.size == Ast.expr.IntNum(contents.length) =>
522-
Some(contents.map(_ match {
523-
case Ast.expr.IntNum(byteVal) if byteVal >= 0x00 && byteVal <= 0xff => "%02X".format(byteVal)
524-
case _ => return None
525-
}).mkString(" "))
520+
case Some(expected: ValidationEquals) => {
521+
expected.value match {
522+
case Ast.expr.List(contents) if blt.size == Ast.expr.IntNum(contents.length) => {
523+
Some(contents.map(_ match {
524+
case Ast.expr.IntNum(byteVal) if byteVal >= 0x00 && byteVal <= 0xff => "%02X".format(byteVal)
525+
case _ => return None
526+
}).mkString(" "))
527+
}
528+
case _ => None
529+
}
530+
}
526531
case _ => None
527532
}
528533
}

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,25 @@ import io.kaitai.struct.problems.KSYParseError
55

66
sealed trait ValidationSpec
77

8-
case class ValidationEq(value: Ast.expr) extends ValidationSpec
8+
sealed abstract class ValidationEquals(val value: Ast.expr) extends ValidationSpec
9+
/** `valid: <...>` key */
10+
case class Validation(_value: Ast.expr) extends ValidationEquals(_value)
11+
/** `valid: eq: <...>` key */
12+
case class ValidationEq(_value: Ast.expr) extends ValidationEquals(_value)
13+
/** `contents: <...>` key */
14+
case class ValidationContents(_value: Ast.expr) extends ValidationEquals(_value)
15+
916
case class ValidationMin(min: Ast.expr) extends ValidationSpec
1017
case class ValidationMax(max: Ast.expr) extends ValidationSpec
1118
case class ValidationRange(min: Ast.expr, max: Ast.expr) extends ValidationSpec
1219
case class ValidationAnyOf(values: List[Ast.expr]) extends ValidationSpec
1320
case class ValidationInEnum() extends ValidationSpec
1421
case class ValidationExpr(checkExpr: Ast.expr) extends ValidationSpec
1522

16-
object ValidationEq {
23+
object ValidationEquals {
1724
val LEGAL_KEYS = Set("eq")
1825

19-
def fromMap(src: Map[String, Any], path: List[String]): Option[ValidationEq] =
26+
def fromMap(src: Map[String, Any], path: List[String]): Option[ValidationEquals] =
2027
ParseUtils.getOptValueExpression(src, "eq", path).map { case eqExpr =>
2128
ParseUtils.ensureLegalKeys(src, LEGAL_KEYS, path)
2229
ValidationEq(eqExpr)
@@ -89,7 +96,7 @@ object ValidationExpr {
8996

9097
object ValidationSpec {
9198
val LEGAL_KEYS =
92-
ValidationEq.LEGAL_KEYS ++
99+
ValidationEquals.LEGAL_KEYS ++
93100
ValidationRange.LEGAL_KEYS ++
94101
ValidationAnyOf.LEGAL_KEYS ++
95102
ValidationInEnum.LEGAL_KEYS ++
@@ -113,10 +120,10 @@ object ValidationSpec {
113120
}
114121

115122
def fromString(value: String, path: List[String]): ValidationSpec =
116-
ValidationEq(Expressions.parse(value))
123+
Validation(Expressions.parse(value))
117124

118125
def fromMap(src: Map[String, Any], path: List[String]): ValidationSpec = {
119-
val opt1 = ValidationEq.fromMap(src, path)
126+
val opt1 = ValidationEquals.fromMap(src, path)
120127
if (opt1.nonEmpty)
121128
return opt1.get
122129
val opt2 = ValidationRange.fromMap(src, path)

shared/src/main/scala/io/kaitai/struct/languages/components/ValidateOps.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ trait ValidateOps extends ExceptionNames {
1717
def attrValidate(attr: AttrLikeSpec, valid: ValidationSpec): Unit = {
1818
val itemValue = Identifier.itemExpr(attr.id, attr.cond.repeat)
1919
valid match {
20-
case ValidationEq(expected) =>
21-
attrValidateExprCompare(attr, Ast.cmpop.Eq, expected, ValidationNotEqualError(attr.dataType))
20+
case expected: ValidationEquals =>
21+
attrValidateExprCompare(attr, Ast.cmpop.Eq, expected.value, ValidationNotEqualError(attr.dataType))
2222
case ValidationMin(min) =>
2323
attrValidateExprCompare(attr, Ast.cmpop.GtE, min, ValidationLessThanError(attr.dataType))
2424
case ValidationMax(max) =>

shared/src/main/scala/io/kaitai/struct/precompile/TypeValidator.scala

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class TypeValidator(specs: ClassSpecs) extends PrecompileStep {
8383
val problemsDataType = validateDataType(attr.dataType, path)
8484

8585
val problemsValid: Iterable[CompilationProblem] = attr.valid match {
86-
case Some(valid) => validateValidClause(valid, attr.dataType, attr.path :+ "valid")
86+
case Some(valid) => validateValidClause(valid, attr.dataType, attr.path)
8787
case None => None // all good
8888
}
8989

@@ -106,7 +106,7 @@ class TypeValidator(specs: ClassSpecs) extends PrecompileStep {
106106
}
107107

108108
val problemsValid: Iterable[CompilationProblem] = pis.valid match {
109-
case Some(valid) => validateValidClause(valid, pis.dataType, pis.path :+ "valid")
109+
case Some(valid) => validateValidClause(valid, pis.dataType, pis.path)
110110
case None => None // all good
111111
}
112112

@@ -226,27 +226,31 @@ class TypeValidator(specs: ClassSpecs) extends PrecompileStep {
226226
): Iterable[CompilationProblem] = {
227227
// TODO: This is not user-face message
228228
val expected = attrType.toString
229+
val validPath = path :+ "valid"
229230
valid match {
230-
// TODO: Need to distinguish between `valid`, `valid.eq` and `contents`
231+
case Validation(value) =>
232+
checkAssertObject(value, attrType, expected, path, "valid")
231233
case ValidationEq(value) =>
232-
checkAssertObject(value, attrType, expected, path, "eq")
234+
checkAssertObject(value, attrType, expected, validPath, "eq")
235+
case ValidationContents(value) =>
236+
checkAssertObject(value, attrType, expected, path, "contents")
233237
case ValidationMin(min) =>
234-
checkAssertObject(min, attrType, expected, path, "min")
238+
checkAssertObject(min, attrType, expected, validPath, "min")
235239
case ValidationMax(max) =>
236-
checkAssertObject(max, attrType, expected, path, "max")
240+
checkAssertObject(max, attrType, expected, validPath, "max")
237241
case ValidationRange(min, max) => {
238-
checkAssertObject(min, attrType, expected, path, "min") ++
239-
checkAssertObject(max, attrType, expected, path, "max")
242+
checkAssertObject(min, attrType, expected, validPath, "min") ++
243+
checkAssertObject(max, attrType, expected, validPath, "max")
240244
}
241245
case ValidationAnyOf(values) => {
242-
val itemPath = path :+ "any-of"
246+
val itemPath = validPath :+ "any-of"
243247
values.zipWithIndex.flatMap { case (value, i) =>
244248
checkAssertObject(value, attrType, expected, itemPath, i.toString)
245249
}
246250
}
247251
case ValidationInEnum() => List()
248252
case ValidationExpr(checkExpr) =>
249-
checkAssert[BooleanType](checkExpr, "boolean", path, "expr")
253+
checkAssert[BooleanType](checkExpr, "boolean", validPath, "expr")
250254
}
251255
}
252256

0 commit comments

Comments
 (0)