package config import ( "io/fs" "net/url" "path/filepath" "go.alanpearce.eu/website/internal/log" "github.com/BurntSushi/toml" "gitlab.com/tozd/go/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"` GoatCounter URL `toml:"goatcounter"` Domains []string 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(dir string, log *log.Logger) (*Config, error) { config := Config{} filename := filepath.Join(dir, "config.toml") log.Debug("reading config", "filename", filename) _, err := toml.DecodeFile(filename, &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 }