godoos/libs/config.go
2024-07-22 17:44:55 +08:00

166 lines
4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package libs
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
)
var reqBodyMap = sync.Map{}
type ReqBody struct {
Name string `json:"name"`
Value string `json:"value"`
Type string `json:"type"`
Info map[string]string `json:"info"`
Plugins map[string]interface{} `json:"plugins"`
}
func GetConfigFile() (string, error) {
baseDir, err := GetAppDir()
if err != nil {
return "", err
}
if !PathExists(baseDir) {
os.MkdirAll(baseDir, 0755)
}
configFile := filepath.Join(baseDir, "config.json")
if !PathExists(configFile) {
// 如果文件不存在,则创建一个空的配置文件
err := os.WriteFile(configFile, []byte("[]"), 0644)
if err != nil {
return "", err
}
}
return configFile, nil
}
// LoadConfig 从文件加载所有ReqBody到映射中如果文件不存在则创建一个空文件
func LoadConfig() error {
filePath, err := GetConfigFile()
if err != nil {
return err
}
var reqBodies []ReqBody
content, err := os.ReadFile(filePath)
if err != nil {
return err
}
err = json.Unmarshal(content, &reqBodies)
if err != nil {
return err
}
for _, reqBody := range reqBodies {
reqBodyMap.Store(reqBody.Name, reqBody)
}
//log.Printf("Load config file success %v", reqBodyMap)
return nil
}
// SaveReqBodiesToFile 将映射中的所有ReqBody保存回文件
func SaveConfig() error {
filePath, err := GetConfigFile()
if err != nil {
return err
}
// 创建一个 map 用来存储已遇到的 Name以防止重复
seenNames := make(map[string]bool)
var reqBodies []ReqBody
reqBodyMap.Range(func(key, value interface{}) bool {
rb := value.(ReqBody)
// 如果 rb.Name 还没有出现在 seenNames 中,才添加到 reqBodies
if _, exists := seenNames[rb.Name]; !exists {
seenNames[rb.Name] = true
reqBodies = append(reqBodies, rb)
}
return true
})
// 使用 json.MarshalIndent 直接获取内容的字节切片
content, err := json.MarshalIndent(reqBodies, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal reqBodies to JSON: %w", err)
}
// log.Printf("====content: %s", string(content))
// 将字节切片直接写入文件,避免了 string(content) 的冗余转换
if err := os.WriteFile(filePath, content, 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
return nil
}
func GetConfig(Name string) (ReqBody, bool) {
value, ok := reqBodyMap.Load(Name)
if ok {
return value.(ReqBody), true
}
return ReqBody{}, false
}
func ExistConfig(Name string) bool {
_, exists := reqBodyMap.Load(Name)
return exists
}
func SetConfig(reqBody ReqBody) error {
reqBodyMap.Store(reqBody.Name, reqBody)
//log.Println("=====SetName", reqBody.Name)
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save updated configuration: %w", err)
}
return nil
}
func SetConfigs(reqBody []ReqBody) error {
for _, rb := range reqBody {
reqBodyMap.Store(rb.Name, rb)
}
//log.Println("=====SetName", reqBody.Name)
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save updated configuration: %w", err)
}
return nil
}
func UpdateConfig(reqBody ReqBody) error {
_, loaded := reqBodyMap.Load(reqBody.Name)
if !loaded {
return fmt.Errorf("config directory %s not found", reqBody.Name)
}
reqBodyMap.Store(reqBody.Name, reqBody)
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save updated configuration: %w", err)
}
return nil
}
func AddConfig(Name string, reqBody ReqBody) error {
_, loaded := reqBodyMap.Load(Name)
if loaded {
return fmt.Errorf("config directory %s already exists", Name)
}
reqBodyMap.Store(Name, reqBody)
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save new configuration: %w", err)
}
return nil
}
func DeleteConfig(Name string) error {
_, loaded := reqBodyMap.Load(Name)
if loaded {
reqBodyMap.Delete(Name)
}
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to delete configuration: %w", err)
}
return nil
}