recommender/internal/base/conf/provider.go

72 lines
1.3 KiB
Go
Raw Normal View History

2024-11-06 10:47:56 +00:00
package conf
import (
"go-template/internal/base/logger"
"os"
"path/filepath"
"strings"
"github.com/spf13/viper"
)
// depth 是配置文件的搜索深度
var depth = 8
func getConfigPath() string {
var path string
if os.Getenv("AMBER_CONFIG") != "" {
path = os.Getenv("AMBER_CONFIG")
return path
}
var pathOptions []string
for i := 0; i <= depth; i++ {
pathOptions = append(pathOptions, strings.Repeat("../", i)+"config.yaml")
}
for _, p := range pathOptions {
if _, err := os.Stat(p); err == nil {
path = p
break
}
}
if path != "" {
// 假设 workDir 是当前工作目录的路径
workDir, err := os.Getwd()
if err != nil {
panic(err)
}
// 将相对路径转换为绝对路径
path, err = filepath.Abs(filepath.Join(workDir, path))
if err != nil {
panic(err)
}
}
return path
}
func ProviderConfig(logger *logger.Logger) *Config {
var path = getConfigPath()
createConfigIfNotExists(path)
if path == "" {
logger.Sugar.Fatal("config file not found, created.")
} else {
logger.Sugar.Infof("config file found at %s", path)
}
c := &Config{}
v := viper.New()
v.SetConfigType("yaml")
v.SetConfigFile(path)
if err := v.ReadInConfig(); err != nil {
logger.Sugar.Fatal(err)
}
if err := v.Unmarshal(c); err != nil {
panic(err)
}
return c
}