Initial commit
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
package viper_server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
"pet-house.com/core/helper/dir"
|
||||
"pet-house.com/core/helper/str"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrEmptyName = errors.New("config'name can't be empty value")
|
||||
)
|
||||
|
||||
type ViperConfig struct {
|
||||
Debug bool
|
||||
Directory string
|
||||
Name string
|
||||
Type string
|
||||
Default []byte
|
||||
Watch func(*viper.Viper) error
|
||||
}
|
||||
|
||||
// getConfigFilePath
|
||||
func (vc ViperConfig) getConfigFilePath() string {
|
||||
return filepath.Join(dir.GetCurrentAbPath(), vc.Directory, str.Join(vc.Name, ".", vc.Type))
|
||||
}
|
||||
|
||||
// getConfigFileDir
|
||||
func (vc ViperConfig) getConfigFileDir() string {
|
||||
if vc.Directory == "" {
|
||||
return "config"
|
||||
}
|
||||
return vc.Directory
|
||||
}
|
||||
|
||||
// IsFileExist
|
||||
func (vc ViperConfig) IsFileExist() bool {
|
||||
return dir.IsExist(vc.getConfigFilePath())
|
||||
}
|
||||
|
||||
// Remove remove config file
|
||||
func (vc ViperConfig) Remove() error {
|
||||
return dir.Remove(vc.getConfigFilePath())
|
||||
}
|
||||
|
||||
// Recover recover config file content
|
||||
func (vc ViperConfig) Recover(b []byte) error {
|
||||
_, err := dir.WriteBytes(vc.getConfigFilePath(), b)
|
||||
return err
|
||||
}
|
||||
|
||||
// Init
|
||||
func Init(vc ViperConfig) error {
|
||||
|
||||
if vc.Name == "" {
|
||||
return ErrEmptyName
|
||||
}
|
||||
|
||||
if vc.Type == "" {
|
||||
vc.Type = "yaml"
|
||||
}
|
||||
|
||||
vc.Directory = vc.getConfigFileDir()
|
||||
|
||||
filePath := vc.getConfigFilePath()
|
||||
if vc.Debug {
|
||||
fmt.Printf("\nthis config file's path is [%s]\n", filePath)
|
||||
}
|
||||
|
||||
vi := viper.New()
|
||||
if vc.Debug {
|
||||
fmt.Printf("this config file's type is [%s]\n", vc.Type)
|
||||
}
|
||||
vi.SetConfigName(vc.Name)
|
||||
vi.SetConfigType(vc.Type)
|
||||
vi.AddConfigPath(vc.Directory)
|
||||
|
||||
isExist := dir.IsExist(filePath)
|
||||
if !isExist {
|
||||
if vc.Debug {
|
||||
fmt.Printf("this config [%s] is not exist\n", filePath)
|
||||
}
|
||||
if vc.Directory != "./" {
|
||||
err := dir.InsureDir(filepath.Dir(filePath))
|
||||
if err != nil {
|
||||
return fmt.Errorf("create dir %s fail : %v", filePath, err)
|
||||
}
|
||||
}
|
||||
|
||||
// ReadConfig
|
||||
if err := vi.ReadConfig(bytes.NewBuffer(vc.Default)); err != nil {
|
||||
if vc.Debug {
|
||||
fmt.Println(string(vc.Default))
|
||||
}
|
||||
return fmt.Errorf("read default config fail : %w ", err)
|
||||
}
|
||||
|
||||
// WriteConfigAs
|
||||
if err := vi.WriteConfigAs(filePath); err != nil {
|
||||
return fmt.Errorf("write config to path fail: %w ", err)
|
||||
}
|
||||
|
||||
} else {
|
||||
if vc.Debug {
|
||||
fmt.Printf("this config file [%s] is existed\n", filePath)
|
||||
}
|
||||
vi.SetConfigFile(filePath)
|
||||
err := vi.ReadInConfig()
|
||||
if err != nil {
|
||||
return fmt.Errorf("read config fail: %w ", err)
|
||||
}
|
||||
}
|
||||
|
||||
err := vc.Watch(vi)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user