From 37162f9b8b6a8a4760877ca84127907c751282b8 Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Tue, 22 Nov 2016 20:02:28 -0500 Subject: make codegenIdType optional --- src/main/scala/CodegenPlugin.scala | 6 +++--- src/main/scala/NamespacedCodegen.scala | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/main/scala/CodegenPlugin.scala b/src/main/scala/CodegenPlugin.scala index 92e595f..8b54887 100644 --- a/src/main/scala/CodegenPlugin.scala +++ b/src/main/scala/CodegenPlugin.scala @@ -24,9 +24,9 @@ object CodegenPlugin extends AutoPlugin { lazy val codegenSchemaBaseClassParts = SettingKey[List[String]]( "codegen-schema-base-class-parts", "parts inherited by each generated schema object") - lazy val codegenIdType = SettingKey[String]( + lazy val codegenIdType = SettingKey[Option[String]]( "codegen-id-type", - "The in-scope type `T` of kind `T[TableRow]` to apply in place T for id columns." + "The in-scope type `T` of kind `T[TableRow]` to apply in place T for id columns" ) lazy val slickCodeGenTask = @@ -40,7 +40,7 @@ object CodegenPlugin extends AutoPlugin { codegenSchemaWhitelist := List.empty, codegenForeignKeys := Map.empty, codegenSchemaBaseClassParts := List.empty, - codegenIdType := "Id", + codegenIdType := Option.empty, slickCodeGenTask := Def.taskDyn { Def.task { Generator.run( diff --git a/src/main/scala/NamespacedCodegen.scala b/src/main/scala/NamespacedCodegen.scala index 6928cde..bddbdea 100644 --- a/src/main/scala/NamespacedCodegen.scala +++ b/src/main/scala/NamespacedCodegen.scala @@ -24,7 +24,7 @@ object Generator { outputPath: String, manualForeignKeys: Map[(String, String), (String, String)], schemaBaseClass: String, - idTypeName: String) = { + idType: Option[String]) = { val dc: DatabaseConfig[JdbcProfile] = DatabaseConfig.forURI[JdbcProfile](uri) val parsedSchemasOpt: Option[Map[String, List[String]]] = @@ -39,7 +39,7 @@ object Generator { outputPath, manualForeignKeys, schemaBaseClass, - idTypeName) + idType) generator.code // Yes... Files are written as a side effect parsedSchemasOpt .getOrElse(Map()) @@ -95,13 +95,19 @@ class Generator(uri: URI, outputPath: String, manualForeignKeys: Map[(String, String), (String, String)], schemaBaseClass: String, - idTypeName: String) + idType: Option[String]) extends SourceCodeGenerator(dbModel) with OutputHelpers { val packageName = new PackageNameGenerator(pkg, dbModel).code val allImports: String = new ImportGenerator(dbModel).code + private val defaultIdImplementation = + """|case class Id[T](v: Int) + |object Id { + | implicit def idTypeMapper[A]: BaseColumnType[Id[A]] = MappedColumnType.base[Id[A], Int](_.v, Id(_)) + |}""".stripMargin + override def code: String = { val sortedSchemaTables: List[(String, Seq[TableDef])] = tables @@ -132,6 +138,13 @@ class Generator(uri: URI, s"${schemaName}.scala" ) + if (idType.isEmpty) { + writeStringToFile(packageName + defaultIdImplementation, + outputPath, + pkg, + "Id.scala") + } + generatedSchema }.mkString("\n\n") @@ -202,9 +215,10 @@ class Generator(uri: URI, .getOrElse((table, column)) } - def idType(tableName: QualifiedName) = { + def tableReferenceName(tableName: QualifiedName) = { val schemaObjectName = tableName.schema.getOrElse("`public`") val rowTypeName = entityName(tableName.table) + val idTypeName = idType.getOrElse("Id") s"$idTypeName[$schemaObjectName.$rowTypeName]" } @@ -214,7 +228,7 @@ class Generator(uri: URI, derefColumn(table.model, column.model) if (referencedColumn.options.contains( slick.ast.ColumnOption.PrimaryKey)) - idType(referencedTable.name) + tableReferenceName(referencedTable.name) else model.tpe match { // TODO: There should be a way to add adhoc custom time mappings -- cgit v1.2.3