package config import ( "os" "path/filepath" "strings" "dove/utils/logger" "dove/utils/toml" ) type Http struct { Debug bool `toml:"debug" default:"false"` Username string `toml:"username"` Password string `toml:"password"` } type Smtp struct { Domain string `toml:"domain" default:"localhost"` MaxMessageSize int `toml:"max_message_size" default:"26214400"` ReadTimeout int `toml:"read_timeout" default:"30"` WriteTimeout int `toml:"write_timeout" default:"30"` AuthRequired bool `toml:"auth_required" default:"false"` Username string `toml:"username"` Password string `toml:"password"` TLSEnabled bool `toml:"tls_enabled" default:"false"` TLSCertPath string `toml:"tls_cert"` TLSKeyPath string `toml:"tls_key"` } type Imap struct { AuthRequired bool `toml:"auth_required" default:"false"` Username string `toml:"username"` Password string `toml:"password"` TLSEnabled bool `toml:"tls_enabled" default:"false"` TLSCertPath string `toml:"tls_cert"` TLSKeyPath string `toml:"tls_key"` } type Pop3 struct { AuthRequired bool `toml:"auth_required" default:"false"` Username string `toml:"username"` Password string `toml:"password"` TLSEnabled bool `toml:"tls_enabled" default:"false"` TLSCertPath string `toml:"tls_cert"` TLSKeyPath string `toml:"tls_key"` } type Storage struct { DataDir string `toml:"data_dir" default:"storage"` MaxObjectSize int64 `toml:"max_object_size" default:"536870912"` } var ( HTTP Http SMTP Smtp IMAP Imap POP3 Pop3 S3 Storage ) var ( AuthEnabled bool DataDir string DevMode bool ) func init() { DevMode = isDevelopmentMode() osConfigDirectory := resolveOSConfigDirectory() DataDir = resolveDataDirectory(DevMode, osConfigDirectory) configFilePath := resolveConfigFilePath(DevMode, osConfigDirectory) if createError := ensureConfigFileExists(configFilePath); createError != nil { logger.Fatalf(LogPrefix, ConfigCreateFailed, createError) } if loadError := loadConfigFile(configFilePath); loadError != nil { logger.Fatalf(LogPrefix, ConfigFileLoadFailed, loadError) } for _, section := range []any{&HTTP, &SMTP, &IMAP, &POP3, &S3} { if parseError := parseSection(section); parseError != nil { logger.Fatalf(LogPrefix, ConfigSectionFailed, parseError) } } AuthEnabled = isAuthEnabled() logger.Successf(LogPrefix, ConfigLoaded) } func isDevelopmentMode() bool { executablePath, pathError := os.Executable() if pathError != nil { return false } return strings.Contains(executablePath, GoBuildPathIndicator) || strings.Contains(executablePath, GoBuildAltIndicator) } func resolveOSConfigDirectory() string { configDirectory, directoryError := os.UserConfigDir() if directoryError != nil { return CurrentDirectory } return filepath.Join(configDirectory, ApplicationDirectory) } func resolveConfigFilePath(developmentMode bool, osConfigDirectory string) string { switch developmentMode { case true: return filepath.Join(CurrentDirectory, ConfigFileName) default: return filepath.Join(osConfigDirectory, ConfigFileName) } } func resolveDataDirectory(developmentMode bool, osConfigDirectory string) string { switch developmentMode { case true: return CurrentDirectory default: return osConfigDirectory } } func ensureConfigFileExists(configFilePath string) error { if _, statError := os.Stat(configFilePath); statError == nil { return nil } configDirectory := filepath.Dir(configFilePath) if mkdirError := os.MkdirAll(configDirectory, ConfigDirectoryPermissions); mkdirError != nil { return mkdirError } return os.WriteFile(configFilePath, defaultConfigContent, ConfigFilePermissions) } func loadConfigFile(configFilePath string) error { if _, statError := os.Stat(configFilePath); statError != nil { return nil } return toml.LoadFile(configFilePath) } func parseSection(target any) error { return toml.Parse(target) } func isAuthEnabled() bool { return HTTP.Username != "" && HTTP.Password != "" }