mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-06-17 04:33:18 +08:00
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type Config struct {
|
|
Address string `mapstructure:"address"`
|
|
MetaTemplate string `mapstructure:"meta_template"`
|
|
ClashTemplate string `mapstructure:"clash_template"`
|
|
RequestRetryTimes int `mapstructure:"request_retry_times"`
|
|
RequestMaxFileSize int64 `mapstructure:"request_max_file_size"`
|
|
CacheExpire int64 `mapstructure:"cache_expire"`
|
|
LogLevel string `mapstructure:"log_level"`
|
|
ShortLinkLength int `mapstructure:"short_link_length"`
|
|
}
|
|
|
|
var GlobalConfig *Config
|
|
var Dev string
|
|
|
|
func LoadConfig() error {
|
|
v := viper.New()
|
|
|
|
// 添加配置文件搜索路径
|
|
v.AddConfigPath(".")
|
|
v.AddConfigPath("./config")
|
|
v.AddConfigPath("/etc/sub2clash/")
|
|
|
|
// 设置默认值
|
|
setDefaults(v)
|
|
|
|
// 设置环境变量前缀和自动绑定
|
|
v.SetEnvPrefix("SUB2CLASH")
|
|
v.AutomaticEnv()
|
|
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
|
|
|
// 尝试按优先级加载不同格式的配置文件
|
|
configLoaded := false
|
|
configNames := []string{"config", "sub2clash"}
|
|
configExts := []string{"yaml", "yml", "json"}
|
|
|
|
for _, name := range configNames {
|
|
for _, ext := range configExts {
|
|
v.SetConfigName(name)
|
|
v.SetConfigType(ext)
|
|
if err := v.ReadInConfig(); err == nil {
|
|
configLoaded = true
|
|
break
|
|
}
|
|
}
|
|
if configLoaded {
|
|
break
|
|
}
|
|
}
|
|
|
|
// 将配置解析到结构体
|
|
GlobalConfig = &Config{}
|
|
if err := v.Unmarshal(GlobalConfig); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func setDefaults(v *viper.Viper) {
|
|
v.SetDefault("address", "0.0.0.0:8011")
|
|
v.SetDefault("meta_template", "https://raw.githubusercontent.com/bestnite/sub2clash/refs/heads/main/templates/template_meta.yaml")
|
|
v.SetDefault("clash_template", "https://raw.githubusercontent.com/bestnite/sub2clash/refs/heads/main/templates/template_clash.yaml")
|
|
v.SetDefault("request_retry_times", 3)
|
|
v.SetDefault("request_max_file_size", 1024*1024*1)
|
|
v.SetDefault("cache_expire", 60*5)
|
|
v.SetDefault("log_level", "info")
|
|
v.SetDefault("short_link_length", 6)
|
|
}
|