Files
DevPack/internal/config/config.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()
}