in ratatool-scalacheck/src/main/scala/com/spotify/ratatool/scalacheck/TableRowGenerator.scala [124:157]
private def tableFieldValueOf(fieldSchema: TableFieldSchema): Gen[TableFieldValue] = {
val n = fieldSchema.getName
def genV(): Gen[TableFieldValue] = fieldSchema.getType match {
case "INTEGER" => Arbitrary.arbInt.arbitrary.map(TableFieldValue(n, _))
case "FLOAT" => Arbitrary.arbFloat.arbitrary.map(TableFieldValue(n, _))
case "BOOLEAN" => Arbitrary.arbBool.arbitrary.map(TableFieldValue(n, _))
case "STRING" => Arbitrary.arbString.arbitrary.map(TableFieldValue(n, _))
case "TIMESTAMP" =>
instantGen.map(i => TableFieldValue(n, timeStampFormatter.print(i) + " UTC"))
case "DATE" => instantGen.map(i => TableFieldValue(n, dateFormatter.print(i)))
case "TIME" => instantGen.map(i => TableFieldValue(n, timeFormatter.print(i)))
case "DATETIME" => instantGen.map(i => TableFieldValue(n, dateTimeFormatter.print(i)))
case "BYTES" =>
Gen
.listOf(Arbitrary.arbByte.arbitrary)
.map(i => ByteBuffer.wrap(i.toArray))
.map(v => TableFieldValue(n, BaseEncoding.base64().encode(v.array())))
case "RECORD" =>
linkedMapOfList(fieldSchema.getFields.asScala).map(TableFieldValue(n, _))
case t => throw new RuntimeException(s"Unknown type: $t")
}
getFieldModeWithDefault(fieldSchema.getMode) match {
case "REQUIRED" => genV()
case "NULLABLE" =>
Arbitrary.arbBool.arbitrary.flatMap { e =>
if (e) genV() else Gen.const(TableFieldValue(n, null))
}
case "REPEATED" => Gen.nonEmptyListOf(genV()).map(l => TableFieldValue(n, l))
case m => throw new RuntimeException(s"Unknown mode: $m")
}
}