refactor(main): delegate setup to config, store, and web packages
Replace in-file bootstrap logic with package-level constructors in `run`: - use `config.Load()` instead of local env parsing/AppConfig helpers - use `store.Open()` and `web.New()` for persistence and app wiring - rename local store variable to `benchmarkStore` for clarity This centralizes startup concerns in dedicated modules, reducing `main.go` boilerplate and improving maintainability.refactor(main): delegate setup to config, store, and web packages Replace in-file bootstrap logic with package-level constructors in `run`: - use `config.Load()` instead of local env parsing/AppConfig helpers - use `store.Open()` and `web.New()` for persistence and app wiring - rename local store variable to `benchmarkStore` for clarity This centralizes startup concerns in dedicated modules, reducing `main.go` boilerplate and improving maintainability.
This commit is contained in:
64
main.go
64
main.go
@@ -2,24 +2,19 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"cpu-benchmark-server/lib/config"
|
||||
"cpu-benchmark-server/lib/store"
|
||||
"cpu-benchmark-server/lib/web"
|
||||
"errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AppConfig struct {
|
||||
Addr string
|
||||
BadgerDir string
|
||||
PageSize int
|
||||
ShutdownTimeout time.Duration
|
||||
}
|
||||
|
||||
func main() {
|
||||
logger := log.New(os.Stdout, "", log.LstdFlags|log.LUTC)
|
||||
if err := run(logger); err != nil {
|
||||
@@ -29,26 +24,26 @@ func main() {
|
||||
}
|
||||
|
||||
func run(logger *log.Logger) error {
|
||||
cfg := loadConfig()
|
||||
cfg := config.Load()
|
||||
|
||||
if err := os.MkdirAll(cfg.BadgerDir, 0o755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
store, err := OpenStore(cfg.BadgerDir)
|
||||
benchmarkStore, err := store.Open(cfg.BadgerDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var closeOnce sync.Once
|
||||
closeStore := func() {
|
||||
if err := store.Close(); err != nil {
|
||||
if err := benchmarkStore.Close(); err != nil {
|
||||
logger.Printf("close store: %v", err)
|
||||
}
|
||||
}
|
||||
defer closeOnce.Do(closeStore)
|
||||
|
||||
app, err := NewApp(store, cfg.PageSize)
|
||||
app, err := web.New(benchmarkStore, cfg.PageSize)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -88,48 +83,3 @@ func run(logger *log.Logger) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func loadConfig() AppConfig {
|
||||
return AppConfig{
|
||||
Addr: envOrDefault("APP_ADDR", ":8080"),
|
||||
BadgerDir: envOrDefault("BADGER_DIR", "data/badger"),
|
||||
PageSize: envIntOrDefault("PAGE_SIZE", 50),
|
||||
ShutdownTimeout: envDurationOrDefault("SHUTDOWN_TIMEOUT", 10*time.Second),
|
||||
}
|
||||
}
|
||||
|
||||
func envOrDefault(key, fallback string) string {
|
||||
if value := os.Getenv(key); value != "" {
|
||||
return value
|
||||
}
|
||||
|
||||
return fallback
|
||||
}
|
||||
|
||||
func envIntOrDefault(key string, fallback int) int {
|
||||
value := os.Getenv(key)
|
||||
if value == "" {
|
||||
return fallback
|
||||
}
|
||||
|
||||
parsed, err := strconv.Atoi(value)
|
||||
if err != nil || parsed <= 0 {
|
||||
return fallback
|
||||
}
|
||||
|
||||
return parsed
|
||||
}
|
||||
|
||||
func envDurationOrDefault(key string, fallback time.Duration) time.Duration {
|
||||
value := os.Getenv(key)
|
||||
if value == "" {
|
||||
return fallback
|
||||
}
|
||||
|
||||
parsed, err := time.ParseDuration(value)
|
||||
if err != nil || parsed <= 0 {
|
||||
return fallback
|
||||
}
|
||||
|
||||
return parsed
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user