Files
upstream-mirror 0f4df23290
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
snapshot of https://github.com/sqlc-dev/sqlc.git (main, 2026-09-16; blobs > 131072B omitted)
2026-09-16 02:17:34 +05:00

240 lines
6.8 KiB
Go

package config
import (
"bytes"
"encoding/json"
"errors"
"io"
"gopkg.in/yaml.v3"
golang "github.com/sqlc-dev/sqlc/internal/codegen/golang/opts"
)
type versionSetting struct {
Number string `json:"version" yaml:"version"`
}
type Engine string
type Paths []string
func (p *Paths) UnmarshalJSON(data []byte) error {
if string(data[0]) == `[` {
var out []string
if err := json.Unmarshal(data, &out); err != nil {
return nil
}
*p = Paths(out)
return nil
}
var out string
if err := json.Unmarshal(data, &out); err != nil {
return nil
}
*p = Paths([]string{out})
return nil
}
func (p *Paths) UnmarshalYAML(unmarshal func(any) error) error {
out := []string{}
if sliceErr := unmarshal(&out); sliceErr != nil {
var ele string
if strErr := unmarshal(&ele); strErr != nil {
return strErr
}
out = []string{ele}
}
*p = Paths(out)
return nil
}
const (
EngineMySQL Engine = "mysql"
EnginePostgreSQL Engine = "postgresql"
EngineSQLite Engine = "sqlite"
EngineClickHouse Engine = "clickhouse"
EngineGoogleSQL Engine = "googlesql"
EngineMSSQL Engine = "mssql"
EngineDuckDB Engine = "duckdb"
)
type Config struct {
Version string `json:"version" yaml:"version"`
Cloud Cloud `json:"cloud" yaml:"cloud"`
Servers []Server `json:"servers" yaml:"servers"`
SQL []SQL `json:"sql" yaml:"sql"`
Overrides Overrides `json:"overrides" yaml:"overrides"`
Plugins []Plugin `json:"plugins" yaml:"plugins"`
Rules []Rule `json:"rules" yaml:"rules"`
Options map[string]yaml.Node `json:"options" yaml:"options"`
}
type Server struct {
Name string `json:"name,omitempty" yaml:"name"`
Engine Engine `json:"engine,omitempty" yaml:"engine"`
URI string `json:"uri" yaml:"uri"`
}
type Database struct {
URI string `json:"uri" yaml:"uri"`
Managed bool `json:"managed" yaml:"managed"`
}
type Cloud struct {
Organization string `json:"organization" yaml:"organization"`
Project string `json:"project" yaml:"project"`
Hostname string `json:"hostname" yaml:"hostname"`
AuthToken string `json:"-" yaml:"-"`
}
type Plugin struct {
Name string `json:"name" yaml:"name"`
Env []string `json:"env" yaml:"env"`
Process *struct {
Cmd string `json:"cmd" yaml:"cmd"`
Format string `json:"format" yaml:"format"`
} `json:"process" yaml:"process"`
WASM *struct {
URL string `json:"url" yaml:"url"`
SHA256 string `json:"sha256" yaml:"sha256"`
} `json:"wasm" yaml:"wasm"`
}
type Rule struct {
Name string `json:"name" yaml:"name"`
Rule string `json:"rule" yaml:"rule"`
Msg string `json:"message" yaml:"message"`
}
type Overrides struct {
Go *golang.GlobalOptions `json:"go,omitempty" yaml:"go"`
}
type SQL struct {
Name string `json:"name" yaml:"name"`
Engine Engine `json:"engine,omitempty" yaml:"engine"`
Schema Paths `json:"schema" yaml:"schema"`
Queries Paths `json:"queries" yaml:"queries"`
Database *Database `json:"database" yaml:"database"`
StrictFunctionChecks bool `json:"strict_function_checks" yaml:"strict_function_checks"`
StrictOrderBy *bool `json:"strict_order_by" yaml:"strict_order_by"`
Gen SQLGen `json:"gen" yaml:"gen"`
Codegen []Codegen `json:"codegen" yaml:"codegen"`
Rules []string `json:"rules" yaml:"rules"`
Analyzer Analyzer `json:"analyzer" yaml:"analyzer"`
}
type Analyzer struct {
Database *bool `json:"database" yaml:"database"`
}
// TODO: Figure out a better name for this
type Codegen struct {
Out string `json:"out" yaml:"out"`
Plugin string `json:"plugin" yaml:"plugin"`
Options yaml.Node `json:"options" yaml:"options"`
}
type SQLGen struct {
Go *golang.Options `json:"go,omitempty" yaml:"go"`
JSON *SQLJSON `json:"json,omitempty" yaml:"json"`
}
type SQLJSON struct {
Out string `json:"out" yaml:"out"`
Indent string `json:"indent,omitempty" yaml:"indent"`
Filename string `json:"filename,omitempty" yaml:"filename"`
}
var ErrMissingEngine = errors.New("unknown engine")
var ErrMissingVersion = errors.New("no version number")
var ErrNoOutPath = errors.New("no output path")
var ErrNoPackagePath = errors.New("missing package path")
var ErrNoPackages = errors.New("no packages")
var ErrNoQuerierType = errors.New("no querier emit type enabled")
var ErrUnknownEngine = errors.New("invalid engine")
var ErrUnknownVersion = errors.New("invalid version number")
var ErrPluginBuiltin = errors.New("a built-in plugin with that name already exists")
var ErrPluginNoName = errors.New("missing plugin name")
var ErrPluginExists = errors.New("a plugin with that name already exists")
var ErrPluginNotFound = errors.New("no plugin found")
var ErrPluginNoType = errors.New("plugin: field `process` or `wasm` required")
var ErrPluginBothTypes = errors.New("plugin: `process` and `wasm` cannot both be defined")
var ErrPluginProcessNoCmd = errors.New("plugin: missing process command")
var ErrInvalidDatabase = errors.New("database must be managed or have a non-empty URI")
var ErrManagedDatabaseNoProject = errors.New(`managed databases require a cloud project
If you don't have a project, you can create one from the sqlc Cloud
dashboard at https://dashboard.sqlc.dev/. If you have a project, ensure
you've set its id as the value of the "project" field within the "cloud"
section of your sqlc configuration. The id will look similar to
"01HA8TWGMYPHK0V2GGMB3R2TP9".`)
var ErrManagedDatabaseNoAuthToken = errors.New(`managed databases require an auth token
If you don't have an auth token, you can create one from the sqlc Cloud
dashboard at https://dashboard.sqlc.dev/. If you have an auth token, ensure
you've set it as the value of the SQLC_AUTH_TOKEN environment variable.`)
func ParseConfig(rd io.Reader) (Config, error) {
var buf bytes.Buffer
var config Config
var version versionSetting
ver := io.TeeReader(rd, &buf)
dec := yaml.NewDecoder(ver)
if err := dec.Decode(&version); err != nil {
return config, err
}
if version.Number == "" {
return config, ErrMissingVersion
}
var err error
switch version.Number {
case "1":
config, err = v1ParseConfig(&buf)
if err != nil {
return config, err
}
case "2":
config, err = v2ParseConfig(&buf)
if err != nil {
return config, err
}
default:
return config, ErrUnknownVersion
}
err = config.addEnvVars()
if err != nil {
return config, err
}
return config, nil
}
type CombinedSettings struct {
Global Config
Package SQL
Go golang.Options
JSON SQLJSON
// TODO: Combine these into a more usable type
Codegen Codegen
}
func Combine(conf Config, pkg SQL) CombinedSettings {
cs := CombinedSettings{
Global: conf,
Package: pkg,
}
if pkg.Gen.Go != nil {
cs.Go = *pkg.Gen.Go
}
if pkg.Gen.JSON != nil {
cs.JSON = *pkg.Gen.JSON
}
return cs
}