Skip to content

Commit 7969b5c

Browse files
committed
Initial commit
1 parent 2ef0ffe commit 7969b5c

File tree

7 files changed

+216
-115
lines changed

7 files changed

+216
-115
lines changed

internal/cmd/cmd.go

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"github.com/spf13/cobra"
1515

1616
"github.com/kyleconroy/sqlc/internal/config"
17-
"github.com/kyleconroy/sqlc/internal/dinosql"
1817
)
1918

2019
// Do runs the command logic.
@@ -75,7 +74,7 @@ var initCmd = &cobra.Command{
7574
if _, err := os.Stat("sqlc.json"); !os.IsNotExist(err) {
7675
return nil
7776
}
78-
blob, err := json.MarshalIndent(config.GenerateSettings{Version: "1"}, "", " ")
77+
blob, err := json.MarshalIndent(config.Config{Version: "2"}, "", " ")
7978
if err != nil {
8079
return err
8180
}
@@ -113,24 +112,14 @@ var checkCmd = &cobra.Command{
113112
Use: "compile",
114113
Short: "Statically check SQL for syntax and type errors",
115114
RunE: func(cmd *cobra.Command, args []string) error {
116-
file, err := os.Open("sqlc.json")
117-
if err != nil {
118-
return err
119-
}
120-
121-
settings, err := config.ParseConfig(file)
115+
stderr := cmd.ErrOrStderr()
116+
dir, err := os.Getwd()
122117
if err != nil {
123-
return err
118+
fmt.Fprintln(stderr, "error parsing sqlc.json: file does not exist")
119+
os.Exit(1)
124120
}
125-
126-
for _, pkg := range settings.Packages {
127-
c, err := dinosql.ParseCatalog(pkg.Schema)
128-
if err != nil {
129-
return err
130-
}
131-
if _, err := dinosql.ParseQueries(c, pkg); err != nil {
132-
return err
133-
}
121+
if _, err := Generate(dir, stderr); err != nil {
122+
os.Exit(1)
134123
}
135124
return nil
136125
},

internal/cmd/generate.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func Generate(dir string, stderr io.Writer) (map[string]string, error) {
4040
return nil, err
4141
}
4242

43-
settings, err := config.ParseConfig(bytes.NewReader(blob))
43+
conf, err := config.ParseConfig(bytes.NewReader(blob))
4444
if err != nil {
4545
switch err {
4646
case config.ErrMissingVersion:
@@ -57,20 +57,19 @@ func Generate(dir string, stderr io.Writer) (map[string]string, error) {
5757
output := map[string]string{}
5858
errored := false
5959

60-
for _, pkg := range settings.Packages {
61-
name := pkg.Name
62-
combo := config.Combine(settings, pkg)
60+
for _, sql := range conf.SQL {
61+
combo := config.Combine(conf, sql)
62+
name := combo.Go.Package
6363
var result dinosql.Generateable
6464

6565
// TODO: This feels like a hack that will bite us later
66-
pkg.Schema = filepath.Join(dir, pkg.Schema)
67-
pkg.Queries = filepath.Join(dir, pkg.Queries)
68-
69-
switch pkg.Engine {
66+
sql.Schema = filepath.Join(dir, sql.Schema)
67+
sql.Queries = filepath.Join(dir, sql.Queries)
7068

69+
switch sql.Engine {
7170
case config.EngineMySQL:
7271
// Experimental MySQL support
73-
q, err := mysql.GeneratePkg(name, pkg.Schema, pkg.Queries, combo)
72+
q, err := mysql.GeneratePkg(name, sql.Schema, sql.Queries, combo)
7473
if err != nil {
7574
fmt.Fprintf(stderr, "# package %s\n", name)
7675
if parserErr, ok := err.(*dinosql.ParserErr); ok {
@@ -86,7 +85,7 @@ func Generate(dir string, stderr io.Writer) (map[string]string, error) {
8685
result = q
8786

8887
case config.EnginePostgreSQL:
89-
c, err := dinosql.ParseCatalog(pkg.Schema)
88+
c, err := dinosql.ParseCatalog(sql.Schema)
9089
if err != nil {
9190
fmt.Fprintf(stderr, "# package %s\n", name)
9291
if parserErr, ok := err.(*dinosql.ParserErr); ok {
@@ -100,7 +99,7 @@ func Generate(dir string, stderr io.Writer) (map[string]string, error) {
10099
continue
101100
}
102101

103-
q, err := dinosql.ParseQueries(c, pkg)
102+
q, err := dinosql.ParseQueries(c, sql)
104103
if err != nil {
105104
fmt.Fprintf(stderr, "# package %s\n", name)
106105
if parserErr, ok := err.(*dinosql.ParserErr); ok {
@@ -126,7 +125,7 @@ func Generate(dir string, stderr io.Writer) (map[string]string, error) {
126125
}
127126

128127
for n, source := range files {
129-
filename := filepath.Join(dir, pkg.Path, n)
128+
filename := filepath.Join(dir, combo.Go.Out, n)
130129
output[filename] = source
131130
}
132131
}

internal/config/config.go

Lines changed: 66 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package config
22

33
import (
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

2929
const 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

3835
type 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

5778
type 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-
98102
func (o *Override) Parse() error {
99103

100104
// validate deprecated postgres_type field
@@ -192,59 +196,46 @@ var ErrNoPackages = errors.New("no packages")
192196
var ErrNoPackageName = errors.New("missing package name")
193197
var 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

238220
type 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
}

internal/config/config_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const unknownVersion = `{
1919
}`
2020

2121
const unknownFields = `{
22+
"version": "1",
2223
"foo": "bar"
2324
}`
2425

0 commit comments

Comments
 (0)