package main import ( "bufio" "crypto/tls" "os" "sync" "go.lindenii.runxiyu.org/lindenii-common/scfg" ) var config struct { Server_name string `scfg:"server_name"` Routes map[string]string `scfg:"routes"` TLS struct { Cert string `scfg:"cert"` Key string `scfg:"key"` } `scfg:"tls"` _tls_config *tls.Config } var config_mutex sync.RWMutex func load_config(path string) error { config_file, err := os.Open(path) if err != nil { return err } decoder := scfg.NewDecoder(bufio.NewReader(config_file)) if func() error { config_mutex.Lock() defer config_mutex.Unlock() err = decoder.Decode(&config) if err != nil { return err } cer, err := tls.LoadX509KeyPair(config.TLS.Cert, config.TLS.Key) if err != nil { return err } config._tls_config = &tls.Config{ Certificates: []tls.Certificate{cer}, MinVersion: tls.VersionTLS13, } return nil }() != nil { return err } return nil } // config_fetch_one fetches one value from the configuration. // // Consequtive calls do not guarantee a consistent snapshot of the // configuration. Use config_consistent_run in these cases. func config_fetch_one[T any](x *T) T { config_mutex.RLock() defer config_mutex.RUnlock() return *x } // config_consistent_run runs the supplied function with a consistent snapshot // of the configuration. func config_consistent_run(f func()) { config_mutex.RLock() defer config_mutex.RUnlock() f() }