1
1
package config
2
2
3
3
import (
4
+ "bytes"
4
5
"encoding/json"
5
6
"errors"
6
7
"fmt"
7
8
"go/types"
8
9
"io"
9
10
"os"
10
- "path/filepath"
11
11
"strings"
12
12
13
13
"github.com/kyleconroy/sqlc/internal/pg"
@@ -28,11 +28,8 @@ The only supported version is "1".
28
28
29
29
const errMessageNoPackages = `No packages are configured`
30
30
31
- type GenerateSettings struct {
32
- Version string `json:"version"`
33
- Packages []PackageSettings `json:"packages"`
34
- Overrides []Override `json:"overrides,omitempty"`
35
- Rename map [string ]string `json:"rename,omitempty"`
31
+ type versionSetting struct {
32
+ Number string `json:"version"`
36
33
}
37
34
38
35
type Engine string
@@ -42,16 +39,40 @@ const (
42
39
EnginePostgreSQL Engine = "postgresql"
43
40
)
44
41
45
- type PackageSettings struct {
46
- Name string `json:"name"`
47
- Engine Engine `json:"engine,omitempty"`
48
- Path string `json:"path"`
49
- Schema string `json:"schema"`
50
- Queries string `json:"queries"`
51
- EmitInterface bool `json:"emit_interface"`
52
- EmitJSONTags bool `json:"emit_json_tags"`
53
- EmitPreparedQueries bool `json:"emit_prepared_queries"`
54
- Overrides []Override `json:"overrides"`
42
+ type Config struct {
43
+ Version string `json:"version"`
44
+ SQL []SQL `json:"sql"`
45
+ Gen Gen `json:"overrides,omitempty"`
46
+ }
47
+
48
+ type Gen struct {
49
+ Go * GenGo `json:"go,omitempty"`
50
+ }
51
+
52
+ type GenGo struct {
53
+ Overrides []Override `json:"overrides,omitempty"`
54
+ Rename map [string ]string `json:"rename,omitempty"`
55
+ }
56
+
57
+ type SQL struct {
58
+ Engine Engine `json:"engine,omitempty"`
59
+ Schema string `json:"schema"`
60
+ Queries string `json:"queries"`
61
+ Gen SQLGen `json:"gen"`
62
+ }
63
+
64
+ type SQLGen struct {
65
+ Go * SQLGo `json:"go,omitempty"`
66
+ }
67
+
68
+ type SQLGo struct {
69
+ EmitInterface bool `json:"emit_interface"`
70
+ EmitJSONTags bool `json:"emit_json_tags"`
71
+ EmitPreparedQueries bool `json:"emit_prepared_queries"`
72
+ Package string `json:"package"`
73
+ Out string `json:"out"`
74
+ Overrides []Override `json:"overrides,omitempty"`
75
+ Rename map [string ]string `json:"rename,omitempty"`
55
76
}
56
77
57
78
type Override struct {
@@ -78,23 +99,6 @@ type Override struct {
78
99
GoBasicType bool
79
100
}
80
101
81
- func (c * GenerateSettings ) ValidateGlobalOverrides () error {
82
- engines := map [Engine ]struct {}{}
83
- for _ , pkg := range c .Packages {
84
- if _ , ok := engines [pkg .Engine ]; ! ok {
85
- engines [pkg .Engine ] = struct {}{}
86
- }
87
- }
88
-
89
- usesMultipleEngines := len (engines ) > 1
90
- for _ , oride := range c .Overrides {
91
- if usesMultipleEngines && oride .Engine == "" {
92
- return fmt .Errorf (`the "engine" field is required for global type overrides because your configuration uses multiple database engines` )
93
- }
94
- }
95
- return nil
96
- }
97
-
98
102
func (o * Override ) Parse () error {
99
103
100
104
// validate deprecated postgres_type field
@@ -192,59 +196,46 @@ var ErrNoPackages = errors.New("no packages")
192
196
var ErrNoPackageName = errors .New ("missing package name" )
193
197
var ErrNoPackagePath = errors .New ("missing package path" )
194
198
195
- func ParseConfig (rd io.Reader ) (GenerateSettings , error ) {
196
- dec := json .NewDecoder (rd )
197
- dec .DisallowUnknownFields ()
198
- var config GenerateSettings
199
- if err := dec .Decode (& config ); err != nil {
199
+ func ParseConfig (rd io.Reader ) (Config , error ) {
200
+ var buf bytes.Buffer
201
+ var config Config
202
+ var version versionSetting
203
+ ver := io .TeeReader (rd , & buf )
204
+ dec := json .NewDecoder (ver )
205
+ if err := dec .Decode (& version ); err != nil {
200
206
return config , err
201
207
}
202
- if config . Version == "" {
208
+ if version . Number == "" {
203
209
return config , ErrMissingVersion
204
210
}
205
- if config .Version != "1" {
211
+ switch version .Number {
212
+ case "1" :
213
+ return v1ParseConfig (& buf )
214
+ // case "2":
215
+ default :
206
216
return config , ErrUnknownVersion
207
217
}
208
- if len (config .Packages ) == 0 {
209
- return config , ErrNoPackages
210
- }
211
- if err := config .ValidateGlobalOverrides (); err != nil {
212
- return config , err
213
- }
214
- for i := range config .Overrides {
215
- if err := config .Overrides [i ].Parse (); err != nil {
216
- return config , err
217
- }
218
- }
219
- for j := range config .Packages {
220
- if config .Packages [j ].Path == "" {
221
- return config , ErrNoPackagePath
222
- }
223
- for i := range config .Packages [j ].Overrides {
224
- if err := config .Packages [j ].Overrides [i ].Parse (); err != nil {
225
- return config , err
226
- }
227
- }
228
- if config .Packages [j ].Name == "" {
229
- config .Packages [j ].Name = filepath .Base (config .Packages [j ].Path )
230
- }
231
- if config .Packages [j ].Engine == "" {
232
- config .Packages [j ].Engine = EnginePostgreSQL
233
- }
234
- }
235
- return config , nil
236
218
}
237
219
238
220
type CombinedSettings struct {
239
- Global GenerateSettings
240
- Package PackageSettings
221
+ Global Config
222
+ Package SQL
223
+ Go SQLGo
224
+ Rename map [string ]string
241
225
Overrides []Override
242
226
}
243
227
244
- func Combine (gen GenerateSettings , pkg PackageSettings ) CombinedSettings {
245
- return CombinedSettings {
246
- Global : gen ,
247
- Package : pkg ,
248
- Overrides : append (gen .Overrides , pkg .Overrides ... ),
228
+ func Combine (conf Config , pkg SQL ) CombinedSettings {
229
+ cs := CombinedSettings {
230
+ Global : conf ,
231
+ Package : pkg ,
232
+ }
233
+ if conf .Gen .Go != nil {
234
+ cs .Rename = conf .Gen .Go .Rename
235
+ cs .Overrides = append (cs .Overrides , conf .Gen .Go .Overrides ... )
236
+ }
237
+ if pkg .Gen .Go != nil {
238
+ cs .Go = * pkg .Gen .Go
249
239
}
240
+ return cs
250
241
}
0 commit comments