11package config
22
33import (
4+ "bytes"
45 "encoding/json"
56 "errors"
67 "fmt"
78 "go/types"
89 "io"
910 "os"
10- "path/filepath"
1111 "strings"
1212
1313 "github.com/kyleconroy/sqlc/internal/pg"
@@ -28,11 +28,8 @@ The only supported version is "1".
2828
2929const errMessageNoPackages = `No packages are configured`
3030
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"`
3633}
3734
3835type Engine string
@@ -42,16 +39,40 @@ const (
4239 EnginePostgreSQL Engine = "postgresql"
4340)
4441
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"`
5576}
5677
5778type Override struct {
@@ -78,23 +99,6 @@ type Override struct {
7899 GoBasicType bool
79100}
80101
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-
98102func (o * Override ) Parse () error {
99103
100104 // validate deprecated postgres_type field
@@ -192,59 +196,46 @@ var ErrNoPackages = errors.New("no packages")
192196var ErrNoPackageName = errors .New ("missing package name" )
193197var ErrNoPackagePath = errors .New ("missing package path" )
194198
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 {
200206 return config , err
201207 }
202- if config . Version == "" {
208+ if version . Number == "" {
203209 return config , ErrMissingVersion
204210 }
205- if config .Version != "1" {
211+ switch version .Number {
212+ case "1" :
213+ return v1ParseConfig (& buf )
214+ // case "2":
215+ default :
206216 return config , ErrUnknownVersion
207217 }
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
236218}
237219
238220type CombinedSettings struct {
239- Global GenerateSettings
240- Package PackageSettings
221+ Global Config
222+ Package SQL
223+ Go SQLGo
224+ Rename map [string ]string
241225 Overrides []Override
242226}
243227
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
249239 }
240+ return cs
250241}
0 commit comments