package gopkgserver import ( "context" _ "embed" "flag" "fmt" "log/slog" "net/http" "os" "github.com/pelletier/go-toml/v2" "go.sudomsg.com/gopkgserver/repo" httpServer "go.sudomsg.com/kit/http" "go.sudomsg.com/kit/logging" logHandler "go.sudomsg.com/kit/logging/http" ) type Config struct { Server []httpServer.ServerConfig `toml:"server"` Logging logging.LogConfig `toml:"logging"` Repos map[string]repo.Repo `toml:"repo"` } func Run(ctx context.Context, fs *flag.FlagSet, args []string) error { var cfgFile string fs.StringVar(&cfgFile, "config", "config.toml", "Path to config file") fs.Parse(args) cfg, err := LoadConfig(cfgFile) if err != nil { return err } if err := logging.Setup(cfg.Logging); err != nil { return err } ctx = logging.WithLogger(ctx, slog.Default()) h, err := repo.New(cfg.Repos) if err != nil { return fmt.Errorf(": %v", err) } mux := http.NewServeMux() mux.Handle("GET /robots.txt", Robot()) mux.Handle("GET /", h) handler := logHandler.New(mux, nil) lns, err := httpServer.OpenListeners(ctx, cfg.Server) defer lns.CloseAll() return httpServer.RunHTTPServers(ctx, lns, handler) } func LoadConfig(cfgFile string) (Config, error) { data, err := os.ReadFile(cfgFile) if err != nil { return Config{}, fmt.Errorf("read config: %w", err) } var cfg Config if err := toml.Unmarshal(data, &cfg); err != nil { return Config{}, fmt.Errorf("parse config: %w", err) } return cfg, nil }