summaryrefslogtreecommitdiff
path: root/internal/config
diff options
context:
space:
mode:
Diffstat (limited to 'internal/config')
-rw-r--r--internal/config/config.go73
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
+}