55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type Config struct {
|
|
HTTPAddress string
|
|
WebRoot string
|
|
StorageRoot string
|
|
PreviewCacheDir string
|
|
DatabaseURL string
|
|
LogLevel slog.Level
|
|
}
|
|
|
|
func FromEnvironment() (Config, error) {
|
|
level, err := parseLogLevel(environment("DRIVE_LOG_LEVEL", "info"))
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
return Config{
|
|
HTTPAddress: environment("DRIVE_HTTP_ADDRESS", ":8080"),
|
|
WebRoot: environment("DRIVE_WEB_ROOT", "web/dist"),
|
|
StorageRoot: environment("DRIVE_STORAGE_ROOT", "/storage/.drive"),
|
|
PreviewCacheDir: environment("DRIVE_PREVIEW_CACHE_ROOT", "/cache/previews"),
|
|
DatabaseURL: os.Getenv("DRIVE_DATABASE_URL"),
|
|
LogLevel: level,
|
|
}, nil
|
|
}
|
|
|
|
func environment(name, fallback string) string {
|
|
if value := strings.TrimSpace(os.Getenv(name)); value != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func parseLogLevel(value string) (slog.Level, error) {
|
|
switch strings.ToLower(value) {
|
|
case "debug":
|
|
return slog.LevelDebug, nil
|
|
case "info":
|
|
return slog.LevelInfo, nil
|
|
case "warn", "warning":
|
|
return slog.LevelWarn, nil
|
|
case "error":
|
|
return slog.LevelError, nil
|
|
default:
|
|
return 0, fmt.Errorf("invalid DRIVE_LOG_LEVEL %q", value)
|
|
}
|
|
}
|