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
197 lines
9.3 KiB
Go
197 lines
9.3 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"path/filepath"
|
|
|
|
yaml "gopkg.in/yaml.v3"
|
|
|
|
golang "github.com/sqlc-dev/sqlc/internal/codegen/golang/opts"
|
|
)
|
|
|
|
type V1GenerateSettings struct {
|
|
Version string `json:"version" yaml:"version"`
|
|
Cloud Cloud `json:"cloud" yaml:"cloud"`
|
|
Packages []v1PackageSettings `json:"packages" yaml:"packages"`
|
|
Overrides []golang.Override `json:"overrides,omitempty" yaml:"overrides,omitempty"`
|
|
Rename map[string]string `json:"rename,omitempty" yaml:"rename,omitempty"`
|
|
Rules []Rule `json:"rules" yaml:"rules"`
|
|
}
|
|
|
|
type v1PackageSettings struct {
|
|
Name string `json:"name" yaml:"name"`
|
|
Engine Engine `json:"engine,omitempty" yaml:"engine"`
|
|
Database *Database `json:"database,omitempty" yaml:"database"`
|
|
Analyzer Analyzer `json:"analyzer" yaml:"analyzer"`
|
|
Path string `json:"path" yaml:"path"`
|
|
Schema Paths `json:"schema" yaml:"schema"`
|
|
Queries Paths `json:"queries" yaml:"queries"`
|
|
EmitInterface bool `json:"emit_interface" yaml:"emit_interface"`
|
|
EmitJSONTags bool `json:"emit_json_tags" yaml:"emit_json_tags"`
|
|
JsonTagsIDUppercase bool `json:"json_tags_id_uppercase" yaml:"json_tags_id_uppercase"`
|
|
EmitDBTags bool `json:"emit_db_tags" yaml:"emit_db_tags"`
|
|
EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"`
|
|
EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"`
|
|
EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"`
|
|
EmitExportedQueries bool `json:"emit_exported_queries,omitempty" yaml:"emit_exported_queries"`
|
|
EmitResultStructPointers bool `json:"emit_result_struct_pointers" yaml:"emit_result_struct_pointers"`
|
|
EmitParamsStructPointers bool `json:"emit_params_struct_pointers" yaml:"emit_params_struct_pointers"`
|
|
EmitMethodsWithDBArgument bool `json:"emit_methods_with_db_argument" yaml:"emit_methods_with_db_argument"`
|
|
EmitPointersForNullTypes bool `json:"emit_pointers_for_null_types" yaml:"emit_pointers_for_null_types"`
|
|
EmitPointersForNullEnumTypes *bool `json:"emit_pointers_for_null_enum_types,omitempty" yaml:"emit_pointers_for_null_enum_types"`
|
|
EmitEnumValidMethod bool `json:"emit_enum_valid_method,omitempty" yaml:"emit_enum_valid_method"`
|
|
EmitAllEnumValues bool `json:"emit_all_enum_values,omitempty" yaml:"emit_all_enum_values"`
|
|
EmitSqlAsComment bool `json:"emit_sql_as_comment,omitempty" yaml:"emit_sql_as_comment"`
|
|
JSONTagsCaseStyle string `json:"json_tags_case_style,omitempty" yaml:"json_tags_case_style"`
|
|
SQLPackage string `json:"sql_package" yaml:"sql_package"`
|
|
SQLDriver string `json:"sql_driver" yaml:"sql_driver"`
|
|
Overrides []golang.Override `json:"overrides" yaml:"overrides"`
|
|
OutputBatchFileName string `json:"output_batch_file_name,omitempty" yaml:"output_batch_file_name"`
|
|
OutputDBFileName string `json:"output_db_file_name,omitempty" yaml:"output_db_file_name"`
|
|
OutputModelsFileName string `json:"output_models_file_name,omitempty" yaml:"output_models_file_name"`
|
|
OutputModelsPath string `json:"output_models_path,omitempty" yaml:"output_models_path"`
|
|
OutputModelsPackage string `json:"output_models_package,omitempty" yaml:"output_models_package"`
|
|
OutputModelsImport string `json:"output_models_import,omitempty" yaml:"output_models_import"`
|
|
OutputModelsEmit *bool `json:"output_models_emit,omitempty" yaml:"output_models_emit"`
|
|
OutputQuerierFileName string `json:"output_querier_file_name,omitempty" yaml:"output_querier_file_name"`
|
|
OutputCopyFromFileName string `json:"output_copyfrom_file_name,omitempty" yaml:"output_copyfrom_file_name"`
|
|
OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"`
|
|
StrictFunctionChecks bool `json:"strict_function_checks" yaml:"strict_function_checks"`
|
|
StrictOrderBy *bool `json:"strict_order_by" yaml:"strict_order_by"`
|
|
QueryParameterLimit *int32 `json:"query_parameter_limit,omitempty" yaml:"query_parameter_limit"`
|
|
OmitSqlcVersion bool `json:"omit_sqlc_version,omitempty" yaml:"omit_sqlc_version"`
|
|
OmitUnusedStructs bool `json:"omit_unused_structs,omitempty" yaml:"omit_unused_structs"`
|
|
Rules []string `json:"rules" yaml:"rules"`
|
|
BuildTags string `json:"build_tags,omitempty" yaml:"build_tags"`
|
|
}
|
|
|
|
func v1ParseConfig(rd io.Reader) (Config, error) {
|
|
dec := yaml.NewDecoder(rd)
|
|
dec.KnownFields(true)
|
|
var settings V1GenerateSettings
|
|
var config Config
|
|
if err := dec.Decode(&settings); err != nil {
|
|
return config, err
|
|
}
|
|
if settings.Version == "" {
|
|
return config, ErrMissingVersion
|
|
}
|
|
if settings.Version != "1" {
|
|
return config, ErrUnknownVersion
|
|
}
|
|
if len(settings.Packages) == 0 {
|
|
return config, ErrNoPackages
|
|
}
|
|
if err := settings.ValidateGlobalOverrides(); err != nil {
|
|
return config, err
|
|
}
|
|
for j := range settings.Packages {
|
|
if settings.Packages[j].Path == "" {
|
|
return config, ErrNoPackagePath
|
|
}
|
|
|
|
if settings.Packages[j].Name == "" {
|
|
settings.Packages[j].Name = filepath.Base(settings.Packages[j].Path)
|
|
}
|
|
|
|
if settings.Packages[j].Engine == "" {
|
|
settings.Packages[j].Engine = EnginePostgreSQL
|
|
}
|
|
}
|
|
|
|
return settings.Translate(), nil
|
|
}
|
|
|
|
func (c *V1GenerateSettings) ValidateGlobalOverrides() error {
|
|
engines := map[Engine]struct{}{}
|
|
for _, pkg := range c.Packages {
|
|
if _, ok := engines[pkg.Engine]; !ok {
|
|
engines[pkg.Engine] = struct{}{}
|
|
}
|
|
}
|
|
|
|
usesMultipleEngines := len(engines) > 1
|
|
for _, oride := range c.Overrides {
|
|
if usesMultipleEngines && oride.Engine == "" {
|
|
return fmt.Errorf(`the "engine" field is required for global type overrides because your configuration uses multiple database engines`)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *V1GenerateSettings) Translate() Config {
|
|
conf := Config{
|
|
Version: c.Version,
|
|
Cloud: c.Cloud,
|
|
Rules: c.Rules,
|
|
}
|
|
|
|
for _, pkg := range c.Packages {
|
|
if pkg.StrictOrderBy == nil {
|
|
defaultValue := true
|
|
pkg.StrictOrderBy = &defaultValue
|
|
}
|
|
conf.SQL = append(conf.SQL, SQL{
|
|
Name: pkg.Name,
|
|
Engine: pkg.Engine,
|
|
Database: pkg.Database,
|
|
Schema: pkg.Schema,
|
|
Queries: pkg.Queries,
|
|
Rules: pkg.Rules,
|
|
Analyzer: pkg.Analyzer,
|
|
Gen: SQLGen{
|
|
Go: &golang.Options{
|
|
EmitInterface: pkg.EmitInterface,
|
|
EmitJsonTags: pkg.EmitJSONTags,
|
|
JsonTagsIdUppercase: pkg.JsonTagsIDUppercase,
|
|
EmitDbTags: pkg.EmitDBTags,
|
|
EmitPreparedQueries: pkg.EmitPreparedQueries,
|
|
EmitExactTableNames: pkg.EmitExactTableNames,
|
|
EmitEmptySlices: pkg.EmitEmptySlices,
|
|
EmitExportedQueries: pkg.EmitExportedQueries,
|
|
EmitResultStructPointers: pkg.EmitResultStructPointers,
|
|
EmitParamsStructPointers: pkg.EmitParamsStructPointers,
|
|
EmitMethodsWithDbArgument: pkg.EmitMethodsWithDBArgument,
|
|
EmitPointersForNullTypes: pkg.EmitPointersForNullTypes,
|
|
EmitPointersForNullEnumTypes: pkg.EmitPointersForNullEnumTypes,
|
|
EmitEnumValidMethod: pkg.EmitEnumValidMethod,
|
|
EmitAllEnumValues: pkg.EmitAllEnumValues,
|
|
EmitSqlAsComment: pkg.EmitSqlAsComment,
|
|
Package: pkg.Name,
|
|
Out: pkg.Path,
|
|
SqlPackage: pkg.SQLPackage,
|
|
SqlDriver: pkg.SQLDriver,
|
|
Overrides: pkg.Overrides,
|
|
JsonTagsCaseStyle: pkg.JSONTagsCaseStyle,
|
|
OutputBatchFileName: pkg.OutputBatchFileName,
|
|
OutputDbFileName: pkg.OutputDBFileName,
|
|
OutputModelsFileName: pkg.OutputModelsFileName,
|
|
OutputModelsPath: pkg.OutputModelsPath,
|
|
OutputModelsPackage: pkg.OutputModelsPackage,
|
|
OutputModelsImport: pkg.OutputModelsImport,
|
|
OutputModelsEmit: pkg.OutputModelsEmit,
|
|
OutputQuerierFileName: pkg.OutputQuerierFileName,
|
|
OutputCopyfromFileName: pkg.OutputCopyFromFileName,
|
|
OutputFilesSuffix: pkg.OutputFilesSuffix,
|
|
QueryParameterLimit: pkg.QueryParameterLimit,
|
|
OmitSqlcVersion: pkg.OmitSqlcVersion,
|
|
OmitUnusedStructs: pkg.OmitUnusedStructs,
|
|
BuildTags: pkg.BuildTags,
|
|
},
|
|
},
|
|
StrictFunctionChecks: pkg.StrictFunctionChecks,
|
|
StrictOrderBy: pkg.StrictOrderBy,
|
|
})
|
|
}
|
|
|
|
if len(c.Overrides) > 0 || len(c.Rename) > 0 {
|
|
conf.Overrides.Go = &golang.GlobalOptions{
|
|
Overrides: c.Overrides,
|
|
Rename: c.Rename,
|
|
}
|
|
}
|
|
|
|
return conf
|
|
}
|