81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
// AppConfig 应用配置结构体,对应 config.yaml
|
|
type AppConfig struct {
|
|
// 日志设置
|
|
LogLevel string `yaml:"log_level"` // 日志级别: trace|debug|info|warn|error
|
|
LogFile string `yaml:"log_file"` // 日志文件路径(可选)
|
|
|
|
// 默认 Profile
|
|
DefaultProfile string `yaml:"default_profile"`
|
|
|
|
// 还原选项
|
|
Restore RestoreConfig `yaml:"restore"`
|
|
}
|
|
|
|
// RestoreConfig 还原相关配置
|
|
type RestoreConfig struct {
|
|
ConflictStrategy string `yaml:"conflict_strategy"` // skip|overwrite|merge|prompt|newest
|
|
CreateRestorePoint bool `yaml:"create_restore_point"` // 是否创建还原点
|
|
DryRunFirst bool `yaml:"dry_run_first"` // 是否先执行干运行
|
|
}
|
|
|
|
// DefaultAppConfig 返回带有合理默认值的配置
|
|
func DefaultAppConfig() *AppConfig {
|
|
return &AppConfig{
|
|
LogLevel: "info",
|
|
DefaultProfile: "standard",
|
|
Restore: RestoreConfig{
|
|
ConflictStrategy: "prompt",
|
|
CreateRestorePoint: true,
|
|
DryRunFirst: false,
|
|
},
|
|
}
|
|
}
|
|
|
|
// LoadConfig 从指定路径加载配置文件,文件不存在时返回默认配置
|
|
func LoadConfig(path string) (*AppConfig, error) {
|
|
cfg := DefaultAppConfig()
|
|
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
// 配置文件不存在,返回默认配置
|
|
return cfg, nil
|
|
}
|
|
return nil, fmt.Errorf("打开配置文件失败: %w", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
if err := yaml.NewDecoder(f).Decode(cfg); err != nil && err != io.EOF {
|
|
return nil, fmt.Errorf("解析配置文件失败: %w", err)
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
// SaveConfig 将配置保存到指定路径
|
|
func SaveConfig(path string, cfg *AppConfig) error {
|
|
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
|
if err != nil {
|
|
return fmt.Errorf("创建配置文件失败: %w", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
enc := yaml.NewEncoder(f)
|
|
enc.SetIndent(2)
|
|
if err := enc.Encode(cfg); err != nil {
|
|
return fmt.Errorf("写入配置文件失败: %w", err)
|
|
}
|
|
|
|
return enc.Close()
|
|
}
|