diff options
| author | mihna123 <mihailonvojinovic@gmail.com> | 2026-09-04 01:13:17 +0200 |
|---|---|---|
| committer | mihna123 <mihailonvojinovic@gmail.com> | 2026-09-04 01:13:17 +0200 |
| commit | 5907450d569c997809674a2abeec97ddf0afe4aa (patch) | |
| tree | 7bd5af677b14433b5c18879e08bb672c87e259e1 /internal/config/config.go | |
| parent | a57f4fcbcd7857286cff854f6d62285df7d098aa (diff) | |
| download | openstore-5907450d569c997809674a2abeec97ddf0afe4aa.tar.gz openstore-5907450d569c997809674a2abeec97ddf0afe4aa.zip | |
config: add config package and wire it into server and handlers
Replace the hardcoded server.Config with an ini-backed config package
that reads /etc/openstore/openstore.conf then the user's config file, so
user settings override system ones and both override the built-in
defaults. Missing files are ignored rather than fatal.
Move route registration into a handlers package that owns the templates
and builds a Page view model, which removes the server -> handlers
import cycle along with the setter-based context injection.
Diffstat (limited to 'internal/config/config.go')
| -rw-r--r-- | internal/config/config.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..2be9dd6 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,73 @@ +package config + +import ( + "fmt" + "net/url" + "os" + "path/filepath" + + "gopkg.in/ini.v1" +) + +type Serve struct { + Addr string `ini:"addr"` +} + +type Instance struct { + Name string `ini:"name"` + ContactEmail string `ini:"contact-email"` + BaseURL string `ini:"base-url"` +} + +type Config struct { + Serve Serve `ini:"serve"` + Instance Instance `ini:"instance"` +} + +var systemConfigPath = "/etc/openstore/openstore.conf" + +func DefaultPath() (string, error) { + dir, err := os.UserConfigDir() + if err != nil { + return "", err + } + + return filepath.Join(dir, "openstore", "openstore.conf"), nil +} + +func Load(filename string) (*Config, error) { + cfg, err := ini.LoadSources(ini.LoadOptions{ + Loose: true, + KeyValueDelimiters: "=", + }, systemConfigPath, filename) + + if err != nil { + return nil, err + } + + config := &Config{ + Serve: Serve{ + Addr: ":3000", + }, + Instance: Instance{ + Name: "Openstore", + ContactEmail: "jane@doe.com", + BaseURL: "https://www.example.com", + }, + } + + err = cfg.MapTo(config) + if err != nil { + return nil, err + } + + u, err := url.Parse(config.Instance.BaseURL) + if err != nil || u.Host == "" || u.Scheme == "" { + return nil, fmt.Errorf( + "config: base-url must be an absolute url, got %s", + config.Instance.BaseURL, + ) + } + + return config, nil +} |
