in scrooge-generator-typescript/src/main/scala/com/gu/scrooge/backend/typescript/TypescriptGenerator.scala [125:213]
def toTsField(
fieldType: FieldType,
index: Option[Int] = None,
name: Option[String] = None,
requiredness: Option[Requiredness] = None,
variableName: String,
depth: Int = 1,
isLastField: Boolean = false
): TsField = {
def simpleField(readingStatement: String, writingStatement: String): TsSimpleField = TsSimpleField(
index = index,
name = name,
isOptional = requiredness.exists(_.isOptional),
variableName = variableName,
depth = depth,
typescriptType = typescriptType(fieldType),
thriftType = thriftType(fieldType),
readingStatement = readingStatement,
writingStatement = writingStatement,
isLastField = isLastField
)
fieldType match {
case TBool => simpleField("readBool", "writeBool")
case TByte => simpleField("readByte", "writeByte")
case TI16 => simpleField("readI16", "writeI16")
case TI32 => simpleField("readI32", "writeI32")
case TI64 => simpleField("readI64", "writeI64")
case TDouble => simpleField("readDouble", "writeDouble")
case TBinary => simpleField("readBinary", "writeBinary")
case TString => simpleField("readString", "writeString")
case _: EnumType => simpleField("readI32", "writeI32")
case struct: StructType => TsNamedField(
index = index,
depth = depth,
name = name,
isOptional = requiredness.exists(_.isOptional),
variableName = variableName,
typescriptType(fieldType),
thriftType = thriftType(fieldType),
companionName = companionName(struct.sid),
isLastField = isLastField
)
case lt: ListType => TsCollectionField(
index = index,
depth = depth,
name = name,
isOptional = requiredness.exists(_.isOptional),
variableName = variableName,
typescriptType = typescriptType(fieldType),
thriftType = thriftType(fieldType),
nestedType = toTsField(lt.eltType, depth = depth + 1, variableName = s"value${depth + 1}"),
startReadingStatement = "readListBegin",
endReadingStatement = "readListEnd",
startWritingStatement = "writeListBegin",
endWritingStatement = "writeListEnd",
isLastField = isLastField,
)
case st: SetType => TsCollectionField(
index = index,
depth = depth,
name = name,
isOptional = requiredness.exists(_.isOptional),
variableName = variableName,
typescriptType = typescriptType(fieldType),
thriftType = thriftType(fieldType),
nestedType = toTsField(st.eltType, depth = depth + 1, variableName = s"value${depth + 1}"),
startReadingStatement = "readSetBegin",
endReadingStatement = "readSetEnd",
startWritingStatement = "writeSetBegin",
endWritingStatement = "writeSetEnd",
isLastField = isLastField,
)
case mt: MapType => TsMapField(
index = index,
depth = depth,
name = name,
isOptional = requiredness.exists(_.isOptional),
variableName = variableName,
typescriptType = typescriptType(fieldType),
thriftType = thriftType(fieldType),
keyType = toTsField(mt.keyType, depth = depth + 1, variableName = s"key${depth + 1}"),
keyIsNumber = mt.keyType == TI16 || mt.keyType == TI32 || mt.keyType.isInstanceOf[EnumType],
valueType = toTsField(mt.valueType, depth = depth + 1, variableName = s"value${depth + 1}"),
isLastField = isLastField,
)
case _ => throw new Exception(s"${fieldType.toString} not implemented yet")
}
}