All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.getquill.codegen.gen.AbstractCodeEmitter.scala Maven / Gradle / Ivy

The newest version!
package io.getquill.codegen.gen

import io.getquill.codegen.model._
import io.getquill.codegen.util.StringUtil.{indent, _}

case class EmitterSettings[TableMeta, ColumnMeta](
  caseClassTables: Seq[TableStereotype[TableMeta, ColumnMeta]],
  querySchemaTables: Seq[TableStereotype[TableMeta, ColumnMeta]],
  codeWrapper: CodeWrapper
)

abstract class AbstractCodeEmitter {
  def apply = code
  def code: String

  abstract class AbstractCaseClassGen {
    def code: String
    def rawCaseClassName: String
    def actualCaseClassName: String

    abstract class AbstractMemberGen {
      def code: String = s"${fieldName}: ${actualType}"
      def rawType: String
      def actualType: String
      def rawFieldName: String
      def fieldName: String
    }
  }

  abstract class AbstractCombinedTableSchemasGen {
    def code: String
    def imports: String

    abstract class AbstractQuerySchemaGen {
      def code: String
      def tableName: String
      def schemaName: Option[String]
      def fullTableName = schemaName.map(_ + ".").getOrElse("") + tableName
      def rawCaseClassName: String
      def actualCaseClassName: String

      abstract class AbstractQuerySchemaMappingGen {
        def code: String
        def rawFieldName: String
        def fieldName: String
        def databaseColumn: String
      }

    }

  }
}

trait ObjectGen {
  def objectName: Option[String]
  def surroundByObject(innerCode: String) =
    objectName match {
      case None => innerCode
      case Some(objectNameActual) =>
        s"""
object ${objectNameActual} {
  ${indent(innerCode)}
}
""".stripMargin.trimFront
    }
}

trait PackageGen {
  def packagePrefix: String

  def packageName: Option[String] = codeWrapper match {
    case NoWrapper                  => None
    case PackageHeader(packageName) => Some(packageName)
    case PackageObject(packageName) => Some(packageName)
    case SimpleObject(packageName)  => Some(packageName)
  }

  def codeWrapper: CodeWrapper
  def surroundByPackage(innerCode: String) =
    codeWrapper match {
      case NoWrapper => innerCode
      case PackageHeader(packageName) => {
        val out =
          if (packagePrefix.trim != "") s"package ${packagePrefix}.${packageName}\n\n"
          else ""
        out + innerCode
      }

      case PackageObject(packageName) =>
        s"""
package object ${packageName} {
  ${indent(innerCode)}
}
""".stripMargin.trimFront

      case SimpleObject(packageName) =>
        s"""
object ${packageName} {
  ${indent(innerCode)}
}
""".stripMargin.trimFront
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy