@@ -8,13 +8,47 @@ import java.sql.Connection
8
8
import java .sql .DriverManager
9
9
import java .sql .ResultSet
10
10
11
+ import caseapp .AppOf
12
+ import caseapp ._
11
13
import io .getquill .NamingStrategy
12
14
import org .scalafmt .FormatResult
13
15
import org .scalafmt .Scalafmt
14
16
import org .scalafmt .ScalafmtStyle
15
17
16
- case class Codegen (options : CodegenOptions , namingStrategy : NamingStrategy ) {
18
+ case class Error (msg : String ) extends Exception (msg)
19
+
20
+ @ AppName (" db-codegen" )
21
+ @ AppVersion (" 0.1.0" )
22
+ @ ProgName (" db-codegen" )
23
+ case class CodegenOptions (
24
+ @ HelpMessage (" user on database server" ) user : String = " postgres" ,
25
+ @ HelpMessage (" password for user on database server" ) password : String =
26
+ " postgres" ,
27
+ @ HelpMessage (" jdbc url" ) url : String = " jdbc:postgresql:postgres" ,
28
+ @ HelpMessage (" schema on database" ) schema : String = " public" ,
29
+ @ HelpMessage (" only tested with postgresql" ) jdbcDriver : String =
30
+ " org.postgresql.Driver" ,
31
+ @ HelpMessage (
32
+ " top level imports of generated file"
33
+ ) imports : String = """ |import java.util.Date
34
+ |import io.getquill.WrappedValue""" .stripMargin,
35
+ @ HelpMessage (
36
+ " package name for generated classes"
37
+ ) `package` : String = " tables" ,
38
+ @ HelpMessage (
39
+ " Which types should write to which types? Format is: numeric,BigDecimal;int8,Long;..."
40
+ ) typeMap : TypeMap = TypeMap .default,
41
+ @ HelpMessage (
42
+ " Do not generate classes for these tables."
43
+ ) excludedTables : List [String ] = List (" schema_version" ),
44
+ @ HelpMessage (
45
+ " Write generated code to this filename. Prints to stdout if not set."
46
+ ) file : Option [String ] = None
47
+ ) extends App {
48
+ Codegen .cliRun(this )
49
+ }
17
50
51
+ case class Codegen (options : CodegenOptions , namingStrategy : NamingStrategy ) {
18
52
import Codegen ._
19
53
val excludedTables = options.excludedTables.toSet
20
54
val columnType2scalaType = options.typeMap.pairs.toMap
@@ -112,7 +146,9 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
112
146
nullable : Boolean ,
113
147
isPrimaryKey : Boolean ,
114
148
references : Option [SimpleColumn ]) {
115
- val scalaType = columnType2scalaType(`type`)
149
+ val scalaType = columnType2scalaType.getOrElse(`type`, {
150
+ throw Error (s " ERROR: missing --type-map for type ' ${`type`}' " )
151
+ })
116
152
117
153
def toArg (namingStrategy : NamingStrategy , tableName : String ): String = {
118
154
s " ${namingStrategy.column(columnName)}: ${this .toSimple.toType}"
@@ -154,10 +190,9 @@ case class Codegen(options: CodegenOptions, namingStrategy: NamingStrategy) {
154
190
|} """ .stripMargin
155
191
}
156
192
}
157
-
158
193
}
159
194
160
- object Codegen {
195
+ object Codegen extends AppOf [ CodegenOptions ] {
161
196
val TABLE_NAME = " TABLE_NAME"
162
197
val COLUMN_NAME = " COLUMN_NAME"
163
198
val TYPE_NAME = " TYPE_NAME"
@@ -174,23 +209,26 @@ object Codegen {
174
209
}
175
210
}
176
211
177
- import caseapp ._
178
-
179
- def main (args : Array [String ]): Unit = {
180
- CaseApp .parse[CodegenOptions ](args) match {
181
- case Right ((options, _)) => run(options)
182
- case Left (msg) => System .err.println(msg)
212
+ def cliRun (codegenOptions : CodegenOptions ,
213
+ outstream : PrintStream = System .out): Unit = {
214
+ try {
215
+ run(codegenOptions, outstream)
216
+ } catch {
217
+ case Error (msg) =>
218
+ System .err.println(msg)
219
+ System .exit(1 )
183
220
}
184
221
}
185
222
186
223
def run (codegenOptions : CodegenOptions ,
187
224
outstream : PrintStream = System .out): Unit = {
188
225
println(" Starting..." )
226
+
189
227
val startTime = System .currentTimeMillis()
190
228
Class .forName(codegenOptions.jdbcDriver)
191
229
val db : Connection =
192
230
DriverManager .getConnection(codegenOptions.url,
193
- codegenOptions.username ,
231
+ codegenOptions.user ,
194
232
codegenOptions.password)
195
233
val codegen = Codegen (codegenOptions, SnakeCaseReverse )
196
234
val foreignKeys = codegen.getForeignKeys(db)
0 commit comments