-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathtables-to-go.go
149 lines (119 loc) · 5.17 KB
/
tables-to-go.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"flag"
"fmt"
"os"
"runtime"
"runtime/debug"
"strings"
"github.com/fraenky8/tables-to-go/v2/internal/cli"
"github.com/fraenky8/tables-to-go/v2/pkg/database"
"github.com/fraenky8/tables-to-go/v2/pkg/output"
"github.com/fraenky8/tables-to-go/v2/pkg/settings"
)
var (
revision = "master"
versionTag = ""
buildTimestamp = ""
)
// CmdArgs represents the supported command line args
type CmdArgs struct {
Help bool
Version bool
*settings.Settings
}
// NewCmdArgs creates and prepares the command line arguments with default values
func NewCmdArgs() (args *CmdArgs) {
args = &CmdArgs{
Settings: settings.New(),
}
flag.BoolVar(&args.Help, "?", false, "shows help and usage")
flag.BoolVar(&args.Help, "help", false, "shows help and usage")
flag.BoolVar(&args.Verbose, "v", args.Verbose, "verbose output")
flag.BoolVar(&args.VVerbose, "vv", args.VVerbose, "more verbose output")
flag.BoolVar(&args.Version, "version", args.Version, "show version and build information")
flag.BoolVar(&args.Force, "f", args.Force, "force; skip tables that encounter errors")
flag.Var(&args.DbType, "t", fmt.Sprintf("type of database to use, currently supported: %v", settings.SprintfSupportedDbTypes()))
flag.StringVar(&args.User, "u", args.User, "user to connect to the database")
flag.StringVar(&args.Pswd, "p", args.Pswd, "password of user")
flag.StringVar(&args.DbName, "d", args.DbName, "database name")
flag.StringVar(&args.Schema, "s", args.Schema, "schema name")
flag.StringVar(&args.Host, "h", args.Host, "host of database")
flag.StringVar(&args.Port, "port", args.Port, "port of database host, if not specified, it will be the default ports for the supported databases")
flag.StringVar(&args.SSLMode, "sslmode", args.SSLMode, "Connect to database using secure connection. (default \"disable\")\nThe value will be passed as is to the underlying driver.\nRefer to this site for supported values: https://www.postgresql.org/docs/current/libpq-ssl.html")
flag.StringVar(&args.Socket, "socket", args.Socket, "The socket file to use for connection. If specified, takes precedence over host:port.")
flag.Var(&args.Tables, "table", "Filter for the specified table(s). Can be used multiple times or with comma separated values without spaces. Example: -table foobar -table foo,bar,baz")
flag.StringVar(&args.OutputFilePath, "of", args.OutputFilePath, "output file path, default is current working directory")
flag.Var(&args.OutputFormat, "format", "format of struct fields (columns): camelCase (c) or original (o)")
flag.Var(&args.FileNameFormat, "fn-format", "format of the filename: camelCase (c, default) or snake_case (s)")
flag.StringVar(&args.Prefix, "pre", args.Prefix, "prefix for file- and struct names")
flag.StringVar(&args.Suffix, "suf", args.Suffix, "suffix for file- and struct names")
flag.StringVar(&args.PackageName, "pn", args.PackageName, "package name")
flag.Var(&args.Null, "null", "representation of NULL columns: sql.Null* (sql) or primitive pointers (native|primitive)")
flag.BoolVar(&args.NoInitialism, "no-initialism", args.NoInitialism, "disable the conversion to upper-case words in column names")
flag.BoolVar(&args.TagsNoDb, "tags-no-db", args.TagsNoDb, "do not create db-tags")
flag.BoolVar(&args.TagsMastermindStructable, "tags-structable", args.TagsMastermindStructable, "generate struct with tags for use in Masterminds/structable (https://github.com/Masterminds/structable)")
flag.BoolVar(&args.TagsMastermindStructableOnly, "tags-structable-only", args.TagsMastermindStructableOnly, "generate struct with tags ONLY for use in Masterminds/structable (https://github.com/Masterminds/structable)")
flag.BoolVar(&args.IsMastermindStructableRecorder, "structable-recorder", args.IsMastermindStructableRecorder, "generate a structable.Recorder field")
// disable the print of usage when an error occurs
flag.CommandLine.Usage = func() {}
flag.Parse()
return args
}
// main function to run the transformations
func main() {
cmdArgs := NewCmdArgs()
if cmdArgs.Help {
flag.Usage()
os.Exit(0)
}
if cmdArgs.Version {
printVersion()
os.Exit(0)
}
if err := cmdArgs.Verify(); err != nil {
fmt.Print(err)
os.Exit(1)
}
db := database.New(cmdArgs.Settings)
if err := db.Connect(); err != nil {
fmt.Println(err)
os.Exit(1)
}
writer := output.NewFileWriter(cmdArgs.OutputFilePath)
if err := cli.Run(cmdArgs.Settings, db, writer); err != nil {
fmt.Printf("run error: %v\n", err)
os.Exit(1)
}
}
func printVersion() {
var withSQLite bool
info, ok := debug.ReadBuildInfo()
if ok {
if versionTag == "" {
versionTag = info.Main.Version
}
for _, s := range info.Settings {
switch s.Key {
case "vcs.revision":
revision = s.Value[:8]
case "-tags":
withSQLite = strings.Contains(s.Value, "sqlite3")
}
if s.Key == "vcs.revision" {
revision = s.Value[:8]
}
}
}
fmt.Printf("tables-to-go/%s-%s %s/%s built with %s", versionTag, revision,
runtime.GOOS, runtime.GOARCH, runtime.Version())
//goland:noinspection GoDfaConstantCondition
if withSQLite {
fmt.Printf(" with sqlite3 support")
}
//goland:noinspection GoBoolExpressions
if buildTimestamp != "" {
fmt.Printf(" on %s", buildTimestamp)
}
fmt.Println()
}