in scrooge-generator/src/main/scala/com/twitter/scrooge/backend/Generator.scala [567:680]
def genType(t: FunctionType, immutable: Boolean = false): CodeFragment
def genPrimitiveType(t: FunctionType): CodeFragment
def genFieldType(f: Field): CodeFragment
def genFieldParams(fields: Seq[Field], asVal: Boolean = false): CodeFragment
def genBaseFinagleService: CodeFragment
def finagleClientFile(
packageDir: File,
service: Service,
options: Set[ServiceOption]
): Option[File] =
None
def finagleServiceFile(
packageDir: File,
service: Service,
options: Set[ServiceOption]
): Option[File] =
None
def templates: HandlebarLoader
def fileExtension: String
def apply(
serviceOptions: Set[ServiceOption],
outputPath: File,
dryRun: Boolean = false,
genAdapt: Boolean = false
): Iterable[File] = {
val generatedFiles = new mutable.ListBuffer[File]
val doc = normalizeCase(resolvedDoc.document)
val header = templates.header(resolvedDoc.filePath)
val namespace = getNamespace(resolvedDoc.document)
val packageDir = namespacedFolder(outputPath, namespace.fullName, dryRun)
val includes = doc.headers.collect {
case x @ Include(_, _) => x
}
val validator = getValidator(resolvedDoc.document)
// validate default annotations applied to structs during generation
validateStructAnnotations(doc.structs)
if (doc.consts.nonEmpty) {
val file = new File(packageDir, "Constants" + fileExtension)
if (!dryRun) {
val dict = constDict(namespace, doc.consts)
writeFile(file, header, templates("consts").generate(dict))
}
generatedFiles += file
}
doc.enums.foreach { enum =>
val file = new File(packageDir, enum.sid.toTitleCase.name + fileExtension)
if (!dryRun) {
val dict = enumDict(namespace, enum)
writeFile(file, header, templates("enum").generate(dict))
}
generatedFiles += file
}
doc.structs.foreach { struct =>
val file = new File(packageDir, struct.sid.toTitleCase.name + fileExtension)
if (!dryRun) {
val templateName =
struct match {
case _: Union => "union"
case _ => "struct"
}
val dict =
structDict(
struct,
Some(namespace),
includes,
serviceOptions,
genAdapt,
toplevel = true,
validator)
writeFile(file, header, templates(templateName).generate(dict))
}
generatedFiles += file
}
doc.services.foreach { service =>
val allOptions = serviceOptions ++ service.options
val interfaceFile = new File(packageDir, service.sid.toTitleCase.name + fileExtension)
val finagleClientFileOpt = finagleClientFile(packageDir, service, allOptions)
val finagleServiceFileOpt = finagleServiceFile(packageDir, service, allOptions)
if (!dryRun) {
val dict = serviceDict(service, namespace, includes, allOptions, genAdapt)
writeFile(interfaceFile, header, templates("service").generate(dict))
finagleClientFileOpt foreach { file =>
val dict = finagleClient(service, namespace, allOptions.contains(WithAsClosable))
writeFile(file, header, templates("finagleClient").generate(dict))
}
finagleServiceFileOpt foreach { file =>
val dict = finagleService(service, namespace)
writeFile(file, header, templates("finagleService").generate(dict))
}
}
generatedFiles += interfaceFile
generatedFiles ++= finagleServiceFileOpt
generatedFiles ++= finagleClientFileOpt
}
generatedFiles
}