package config import ( "io/fs" "net/url" "website/internal/log" "github.com/BurntSushi/toml" "github.com/pkg/errors" ) type Taxonomy struct { Name string Feed bool } type MenuItem struct { Name string URL URL `toml:"url"` } type URL struct { *url.URL } func (u *URL) UnmarshalText(text []byte) (err error) { u.URL, err = url.Parse(string(text)) return errors.Wrapf(err, "could not parse URL %s", string(text)) } type Config struct { DefaultLanguage string `toml:"default_language"` BaseURL URL `toml:"base_url"` InjectLiveReload bool Title string Email string Description string DomainStartDate string `toml:"domain_start_date"` OriginalDomain string `toml:"original_domain"` OIDCHost URL `toml:"oidc_host"` Taxonomies []Taxonomy CSP *CSP `toml:"content-security-policy"` Extra struct { Headers map[string]string } Menus map[string][]MenuItem } func GetConfig() (*Config, error) { config := Config{} log.Debug("reading config.toml") _, err := toml.DecodeFile("config.toml", &config) if err != nil { switch t := err.(type) { case *fs.PathError: return nil, errors.WithMessage(t, "could not read configuration") case *toml.ParseError: return nil, errors.WithMessage(t, t.ErrorWithUsage()) } return nil, errors.Wrap(err, "config error") } return &config, nil }