caltrack/config/config.go

86 lines
1.4 KiB
Go
Raw Permalink Normal View History

2026-02-23 18:21:23 +00:00
package config
import (
"caltrack/types"
"os"
"path/filepath"
"github.com/BurntSushi/toml"
)
func DefaultConfig() types.Config {
return types.Config{
CurrentWeightKg: 80.0,
TargetWeightKg: 70.0,
HeightCm: 175,
Age: 30,
Sex: "male",
ActivityLevel: "moderate",
WeeklyLossKg: 0.5,
ListenAddr: ":8080",
Timezone: "America/Halifax",
2026-02-23 18:21:23 +00:00
}
}
func DataDir() (string, error) {
if dir := os.Getenv("CALTRACK_DATA_DIR"); dir != "" {
return dir, nil
}
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".config", "caltrack"), nil
}
func ConfigPath() (string, error) {
dir, err := DataDir()
if err != nil {
return "", err
}
return filepath.Join(dir, "config.toml"), nil
}
func Load() (types.Config, error) {
cfg := DefaultConfig()
path, err := ConfigPath()
if err != nil {
return cfg, err
}
if _, err := os.Stat(path); os.IsNotExist(err) {
return cfg, nil
}
_, err = toml.DecodeFile(path, &cfg)
if err != nil {
return cfg, err
}
if cfg.ListenAddr == "" {
cfg.ListenAddr = ":8080"
}
return cfg, nil
}
func Save(cfg types.Config) error {
path, err := ConfigPath()
if err != nil {
return err
}
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
f, err := os.Create(path)
if err != nil {
return err
}
defer f.Close()
return toml.NewEncoder(f).Encode(cfg)
}