You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
4 years ago
|
package config
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/tal-tech/go-zero/tools/goctl/util"
|
||
|
"gopkg.in/yaml.v2"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
configFile = "config.yaml"
|
||
|
configFolder = "config"
|
||
|
DefaultFormat = "gozero"
|
||
|
)
|
||
|
|
||
|
const defaultYaml = `# 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. if you want to independently control the file
|
||
|
# naming style of the api, rpc, and model layers, you can set it through apiNamingFormat,
|
||
|
# rpcNamingFormat, modelNamingFormat, and independent control is not enabled by default.
|
||
|
# for more information, please see #{apiNamingFormat},#{rpcNamingFormat},#{modelNamingFormat}
|
||
|
# Note: namingFormat is based on snake or camel string
|
||
|
namingFormat: gozero
|
||
|
`
|
||
|
|
||
|
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"`
|
||
|
}
|
||
|
|
||
|
func NewConfig(format string) (*Config, error) {
|
||
|
if len(format) == 0 {
|
||
|
format = DefaultFormat
|
||
|
}
|
||
|
cfg := &Config{NamingFormat: format}
|
||
|
err := validate(cfg)
|
||
|
return cfg, err
|
||
|
}
|
||
|
|
||
|
func InitOrGetConfig() (*Config, error) {
|
||
|
var (
|
||
|
defaultConfig Config
|
||
|
)
|
||
|
err := yaml.Unmarshal([]byte(defaultYaml), &defaultConfig)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
goctlHome, err := util.GetGoctlHome()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
configDir := filepath.Join(goctlHome, configFolder)
|
||
|
configFilename := filepath.Join(configDir, configFile)
|
||
|
if util.FileExists(configFilename) {
|
||
|
data, err := ioutil.ReadFile(configFilename)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
err = yaml.Unmarshal(data, &defaultConfig)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
err = validate(&defaultConfig)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &defaultConfig, nil
|
||
|
}
|
||
|
|
||
|
err = util.MkdirIfNotExist(configDir)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
f, err := os.Create(configFilename)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
defer func() {
|
||
|
_ = f.Close()
|
||
|
}()
|
||
|
|
||
|
_, err = f.WriteString(defaultYaml)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
err = validate(&defaultConfig)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &defaultConfig, nil
|
||
|
}
|
||
|
|
||
|
func validate(cfg *Config) error {
|
||
|
if len(strings.TrimSpace(cfg.NamingFormat)) == 0 {
|
||
|
return errors.New("missing namingFormat")
|
||
|
}
|
||
|
return nil
|
||
|
}
|