in scrooge-generator-typescript/src/main/scala/com/gu/scrooge/backend/typescript/TypescriptGenerator.scala [281:362]
override def apply(
serviceOptions: Set[ServiceOption],
outputPath: File,
dryRun: Boolean = false,
genAdapt: Boolean = false
): Iterable[File] = {
val generatedFiles = new mutable.ListBuffer[File]
val packageDir = namespacedFolder(outputPath, namespace.fullName, dryRun)
def renderFile(templateName: String, templateParams: Product, filename: String) = {
val fileContent = MustacheUtils.renderTemplate(namespaceLanguage, templateName, templateParams)
val file = new File(packageDir, s"${filename}.ts")
if (!dryRun) {
val writer = new FileWriter(file)
try {
writer.write(fileContent)
} finally {
writer.close()
}
}
file
}
def renderStruct(struct: StructLike, templateName: String): File = {
val lastField = struct.fields.last
renderFile(
templateName = templateName,
templateParams = TsStruct(
typeName = typeName(struct.sid),
companionName = companionName(struct.sid),
fields = struct.fields.map(field => toTsField(
fieldType = field.fieldType,
index = Some(field.index),
name = Some(field.originalName),
requiredness = Some(field.requiredness),
variableName = s"value1",
isLastField = field == lastField
)),
imports = importsForStruct(struct),
needsInt64Import = needsInt64Import(struct.fields.map(_.fieldType)),
defaults = struct.fields
.map(f => f.sid -> f.default )
.collect { case (sid, Some(default)) => TsDefaultValue(sid.toCamelCase.name, constValue(default)) }
),
filename(struct.sid)
)
}
if (document.consts.nonEmpty) {
generatedFiles += renderFile(
templateName = "const.mustache",
templateParams = TsConsts(
entries = document.consts.map(c => {
TsConstEntry(
name = c.sid.toUpperCase.name,
typescriptType = typescriptType(c.fieldType),
value = constValue(c.value)
)
})
),
filename = s"constants"
)
}
generatedFiles ++= document.enums.map { enum =>
renderFile(
templateName = "enum.mustache",
templateParams = TsEnum(
typeName = enum.sid.toTitleCase.name,
entries = enum.values.map(v => TsEnumEntry(v.sid.toUpperCase.name, v.value)),
),
filename(enum.sid)
)
}
generatedFiles ++= document.structs.map {
case union: Union => renderStruct(union, "union.mustache")
case struct: StructLike => renderStruct(struct, "struct.mustache")
}
generatedFiles
}