package main import ( "fmt" "git.sr.ht/~emersion/go-scfg" ) type config struct { HTTPAddress string LogLevel string ntfy ntfyConfig } type ntfyConfig struct { Topic string User string Password string } func readConfig(path string) (*config, error) { cfg, err := scfg.Load(path) if err != nil { return nil, err } config := new(config) // Set default values config.HTTPAddress = "127.0.0.1:8080" config.LogLevel = "info" d := cfg.Get("log-level") if d != nil { if err := d.ParseParams(&config.LogLevel); err != nil { return nil, err } } d = cfg.Get("http-address") if d != nil { if err := d.ParseParams(&config.HTTPAddress); err != nil { return nil, err } } ntfyDir := cfg.Get("ntfy") if ntfyDir == nil { return nil, fmt.Errorf("%q directive missing", "ntfy") } d = ntfyDir.Children.Get("topic") if d == nil { return nil, fmt.Errorf("%q missing from %q directive", "topic", "ntfy") } if err := d.ParseParams(&config.ntfy.Topic); err != nil { return nil, err } d = ntfyDir.Children.Get("user") if d != nil { if err := d.ParseParams(&config.ntfy.User); err != nil { return nil, err } } d = ntfyDir.Children.Get("password") if d != nil { if err := d.ParseParams(&config.ntfy.Password); err != nil { return nil, err } } return config, nil }