Files
2026-09-21 16:46:55 +08:00

63 lines
1.4 KiB
Go

package config
import (
"fmt"
"os"
"path/filepath"
)
// ResolveConfigPath finds config.yaml: --config, then next to the exe, then cwd.
func ResolveConfigPath(flagPath string) (string, error) {
var cands []string
if flagPath != "" {
cands = append(cands, flagPath)
}
if exe, err := os.Executable(); err == nil {
dir := filepath.Dir(exe)
cands = append(cands, filepath.Join(dir, "config.yaml"))
cands = append(cands, filepath.Join(dir, "..", "config.yaml"))
}
cands = append(cands, "config.yaml")
seen := map[string]bool{}
for _, p := range cands {
abs, err := filepath.Abs(p)
if err != nil {
continue
}
abs = filepath.Clean(abs)
if seen[abs] {
continue
}
seen[abs] = true
st, err := os.Stat(abs)
if err == nil && !st.IsDir() {
return abs, nil
}
}
if flagPath == "" {
flagPath = "config.yaml"
}
abs, err := filepath.Abs(flagPath)
if err != nil {
return flagPath, fmt.Errorf("config not found: %s", flagPath)
}
return abs, fmt.Errorf("config not found: %s", abs)
}
// ResolvePaths makes LogFile absolute relative to the config file directory.
func (c *Config) ResolvePaths() {
if c == nil {
return
}
if p, err := filepath.Abs(c.Path); err == nil {
c.Path = p
}
if c.LogFile == "" {
c.LogFile = DefaultLogFile
}
if !filepath.IsAbs(c.LogFile) {
c.LogFile = filepath.Join(filepath.Dir(c.Path), c.LogFile)
}
c.LogFile = filepath.Clean(c.LogFile)
}