mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-13 09:50:00 +08:00
(goctl)feature/model config (#4062)
Co-authored-by: Kevin Wan <wanjunfeng@gmail.com>
This commit is contained in:
@@ -1,25 +1,71 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/zeromicro/go-zero/tools/goctl/util/ctx"
|
||||
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// DefaultFormat defines a default naming style
|
||||
const DefaultFormat = "gozero"
|
||||
const (
|
||||
// DefaultFormat defines a default naming style
|
||||
DefaultFormat = "gozero"
|
||||
configFile = "goctl.yaml"
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed default.yaml
|
||||
defaultConfig []byte
|
||||
|
||||
ExternalConfig *External
|
||||
)
|
||||
|
||||
// Config defines the file naming style
|
||||
type Config struct {
|
||||
// NamingFormat is used to define the naming format of the generated file name.
|
||||
// just like time formatting, you can specify the formatting style through the
|
||||
// two format characters go, and zero. for example: snake format you can
|
||||
// define as go_zero, camel case format you can it is defined as goZero,
|
||||
// and even split characters can be specified, such as go#zero. in theory,
|
||||
// any combination can be used, but the prerequisite must meet the naming conventions
|
||||
// of each operating system file name.
|
||||
// Note: NamingFormat is based on snake or camel string
|
||||
NamingFormat string `yaml:"namingFormat"`
|
||||
}
|
||||
type (
|
||||
Config struct {
|
||||
// NamingFormat is used to define the naming format of the generated file name.
|
||||
// just like time formatting, you can specify the formatting style through the
|
||||
// two format characters go, and zero. for example: snake format you can
|
||||
// define as go_zero, camel case format you can it is defined as goZero,
|
||||
// and even split characters can be specified, such as go#zero. in theory,
|
||||
// any combination can be used, but the prerequisite must meet the naming conventions
|
||||
// of each operating system file name.
|
||||
// Note: NamingFormat is based on snake or camel string
|
||||
NamingFormat string `yaml:"namingFormat"`
|
||||
}
|
||||
|
||||
External struct {
|
||||
// Model is the configuration for the model code generation.
|
||||
Model Model `yaml:"model,omitempty"`
|
||||
}
|
||||
|
||||
// Model defines the configuration for the model code generation.
|
||||
Model struct {
|
||||
// TypesMap: custom Data Type Mapping Table.
|
||||
TypesMap map[string]ModelTypeMapOption `yaml:"types_map,omitempty" `
|
||||
}
|
||||
|
||||
// ModelTypeMapOption custom Type Options.
|
||||
ModelTypeMapOption struct {
|
||||
// Type: valid when not using UnsignedType and NullType.
|
||||
Type string `yaml:"type"`
|
||||
|
||||
// UnsignedType: valid when not using NullType.
|
||||
UnsignedType string `yaml:"unsigned_type,omitempty"`
|
||||
|
||||
// NullType: priority use.
|
||||
NullType string `yaml:"null_type,omitempty"`
|
||||
|
||||
// Pkg defines the package of the custom type.
|
||||
Pkg string `yaml:"pkg,omitempty"`
|
||||
}
|
||||
)
|
||||
|
||||
// NewConfig creates an instance for Config
|
||||
func NewConfig(format string) (*Config, error) {
|
||||
@@ -31,6 +77,58 @@ func NewConfig(format string) (*Config, error) {
|
||||
return cfg, err
|
||||
}
|
||||
|
||||
func init() {
|
||||
var cfg External
|
||||
err := loadConfig(&cfg)
|
||||
if err != nil {
|
||||
fmt.Println(err.Error())
|
||||
} else {
|
||||
ExternalConfig = &cfg
|
||||
}
|
||||
}
|
||||
|
||||
func loadConfig(cfg *External) error {
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cfgFile, err := getConfigPath(wd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var content []byte
|
||||
if pathx.FileExists(cfgFile) {
|
||||
content, err = os.ReadFile(cfgFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(content) == 0 {
|
||||
content = append(content, defaultConfig...)
|
||||
}
|
||||
return yaml.Unmarshal(content, cfg)
|
||||
}
|
||||
|
||||
// getConfigPath returns the configuration file path, but not create the file.
|
||||
func getConfigPath(workDir string) (string, error) {
|
||||
abs, err := filepath.Abs(workDir)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
err = pathx.MkdirIfNotExist(abs)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
projectCtx, err := ctx.Prepare(abs)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return filepath.Join(projectCtx.Dir, configFile), nil
|
||||
}
|
||||
|
||||
func validate(cfg *Config) error {
|
||||
if len(strings.TrimSpace(cfg.NamingFormat)) == 0 {
|
||||
return errors.New("missing namingFormat")
|
||||
|
||||
Reference in New Issue
Block a user