package main import ( "log" "os" "strconv" "strings" "AbstractWizard/audit" "AbstractWizard/server" ) func main() { cfg := server.AppConfig{ ConfigDir: envOrDefault("CONFIG_DIR", "/config"), ListenAddr: envOrDefault("LISTEN_ADDR", "127.0.0.1:8080"), MaxBackups: envOrDefaultInt("MAX_BACKUPS", 10), CORSOrigins: parseCSV(os.Getenv("CORS_ORIGINS")), } if err := os.MkdirAll(cfg.ConfigDir, 0o755); err != nil { log.Fatalf("failed to create config directory %s: %v", cfg.ConfigDir, err) } auditLog := audit.NewLogger() srv := server.New(cfg, auditLog) log.Printf("config_dir=%s listen_addr=%s max_backups=%d cors_origins=%v", cfg.ConfigDir, cfg.ListenAddr, cfg.MaxBackups, cfg.CORSOrigins) if err := srv.ListenAndServe(); err != nil { log.Fatalf("server error: %v", err) } } func envOrDefault(key, defaultVal string) string { if v := os.Getenv(key); v != "" { return v } return defaultVal } func envOrDefaultInt(key string, defaultVal int) int { v := os.Getenv(key) if v == "" { return defaultVal } n, err := strconv.Atoi(v) if err != nil { log.Printf("warning: invalid %s=%q, using default %d", key, v, defaultVal) return defaultVal } return n } func parseCSV(s string) []string { if s == "" { return nil } parts := strings.Split(s, ",") result := make([]string, 0, len(parts)) for _, p := range parts { p = strings.TrimSpace(p) if p != "" { result = append(result, p) } } return result }