67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package viperx
|
||
|
||
import (
|
||
"bytes"
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"github.com/spf13/viper"
|
||
)
|
||
|
||
var paths = []string{
|
||
".",
|
||
"./etc",
|
||
"./config",
|
||
}
|
||
|
||
// ConfigFileEncryptorHook 配置文件加密器
|
||
type ConfigFileEncryptorHook interface {
|
||
IsCipherText([]byte) bool
|
||
Encrypt([]byte) []byte
|
||
Decrypt([]byte) []byte
|
||
}
|
||
|
||
var configFileEH ConfigFileEncryptorHook
|
||
|
||
// RegisterConfigEncryptor 注册配置文件加密器
|
||
func RegisterConfigEncryptor(h ConfigFileEncryptorHook) {
|
||
configFileEH = h
|
||
}
|
||
|
||
// GetViper 获取viper配置
|
||
// name: 配置文件路径和名称,json、yaml、ini等
|
||
func GetViper(name string) *viper.Viper {
|
||
buf, err := ReadFile(name)
|
||
if err != nil {
|
||
panic(fmt.Sprintf("Error while reading config file %s: %v", name, err))
|
||
}
|
||
|
||
if configFileEH != nil {
|
||
if configFileEH.IsCipherText(buf) {
|
||
buf = configFileEH.Decrypt(buf)
|
||
}
|
||
}
|
||
|
||
vp := viper.New()
|
||
ext := filepath.Ext(name)
|
||
if len(ext) > 0 {
|
||
ext = ext[1:] // 去掉点
|
||
}
|
||
vp.SetConfigType(ext)
|
||
if err = vp.ReadConfig(bytes.NewReader(buf)); err != nil {
|
||
panic(fmt.Sprintf("Error while reading config file %s: %v", name, err))
|
||
}
|
||
return vp
|
||
}
|
||
|
||
func ReadFile(name string) ([]byte, error) {
|
||
for _, v := range paths {
|
||
file := filepath.Join(v, name)
|
||
if _, err := os.Stat(file); err == nil {
|
||
return os.ReadFile(file)
|
||
}
|
||
}
|
||
return nil, nil
|
||
}
|