diff options
Diffstat (limited to 'internal/config')
| -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 +} |
