versia-go/config/config.go
2024-08-24 16:52:58 +02:00

100 lines
1.9 KiB
Go

package config
import (
"git.devminer.xyz/devminer/unitel"
"github.com/joho/godotenv"
"github.com/rs/zerolog/log"
"net/url"
"os"
"regexp"
"strconv"
)
type Config struct {
Port int
PublicAddress *url.URL
Host string
SharedInboxURL *url.URL
InstanceName string
InstanceDescription *string
NATSURI string
NATSStreamName string
DatabaseURI string
Telemetry unitel.Opts
ForwardTracesTo *regexp.Regexp
}
var C Config
func Load() {
if err := godotenv.Load(".env.local", ".env"); err != nil {
log.Warn().Err(err).Msg("Failed to load .env file")
}
publicAddress, err := url.Parse(os.Getenv("PUBLIC_ADDRESS"))
if err != nil {
log.Fatal().Err(err).Msg("Failed to parse PUBLIC_ADDRESS")
}
var forwardTracesTo *regexp.Regexp
if raw := optionalEnvStr("FORWARD_TRACES_TO"); raw != nil {
if forwardTracesTo, err = regexp.Compile(*raw); err != nil {
log.Fatal().Err(err).Str("raw", *raw).Msg("Failed to compile")
}
}
C = Config{
Port: getEnvInt("VERSIA_PORT", 80),
PublicAddress: publicAddress,
Host: publicAddress.Host,
SharedInboxURL: publicAddress.ResolveReference(&url.URL{Path: "/api/inbox"}),
InstanceName: os.Getenv("INSTANCE_NAME"),
InstanceDescription: optionalEnvStr("INSTANCE_DESCRIPTION"),
NATSURI: os.Getenv("NATS_URI"),
NATSStreamName: getEnvStr("NATS_STREAM_NAME", "versia-go"),
DatabaseURI: os.Getenv("DATABASE_URI"),
ForwardTracesTo: forwardTracesTo,
Telemetry: unitel.ParseOpts("versia-go"),
}
return
}
func optionalEnvStr(key string) *string {
value := os.Getenv(key)
if value == "" {
return nil
}
return &value
}
func getEnvStr(key, default_ string) string {
if value, ok := os.LookupEnv(key); ok {
return value
}
return default_
}
func getEnvInt(key string, default_ int) int {
if value, ok := os.LookupEnv(key); ok {
parsed, err := strconv.Atoi(value)
if err != nil {
panic(err)
}
return parsed
}
return default_
}