41 lines
1.2 KiB
Go

package config
import (
"fmt"
"github.com/go-playground/validator/v10"
"github.com/ilyakaznacheev/cleanenv"
"net/url"
"reflect"
"slices"
)
type Config struct {
WebserverAddress string `yaml:"webserver_address" env:"WEBSERVER_ADDRESS" env-required:"true" validate:"hostname_port"`
NatsUrl string `yaml:"nats_url" env:"NATS_URL" env-required:"true" validate:"url"`
Debug bool `yaml:"debug" env:"DEBUG"`
Proxy string `yaml:"proxy" env:"PROXY" env-default:"" validate:"omitempty,proxy"`
}
func Read() (Config, error) {
var cfg Config
err := cleanenv.ReadConfig("config.yml", &cfg)
if err != nil {
return Config{}, err
}
validate := validator.New()
if err := validate.RegisterValidation("proxy", validateProxy); err != nil {
panic(fmt.Errorf("register validation: %w", err))
}
err = validate.Struct(cfg)
return cfg, err
}
func validateProxy(fl validator.FieldLevel) bool {
if fl.Field().Kind() != reflect.String {
return false
}
validSchemes := []string{"http", "https", "socks"}
pUrl, err := url.Parse(fl.Field().String())
return err == nil && slices.Contains(validSchemes, pUrl.Scheme) && pUrl.Opaque == "" && pUrl.Path == ""
}