package main import ( "embed" "fmt" "io/fs" "log/slog" "os/signal" "syscall" "github.com/mjensen/weimar/internal/config" "github.com/mjensen/weimar/internal/server" "github.com/spf13/cobra" "github.com/spf13/viper" ) //go:embed web/build/* var webFS embed.FS var adminEmail string var adminPassword string var serveCmd = &cobra.Command{ Use: "serve", Short: "Start the HTTP server", RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromViper() if adminEmail != "" && adminPassword != "" { slog.Info("first-run admin credentials provided", "email", adminEmail) } webSub, err := fs.Sub(webFS, "web/build") if err != nil { return fmt.Errorf("reading embedded web build: %w", err) } srv, err := server.New(cfg, webSub) if err != nil { return fmt.Errorf("creating server: %w", err) } ctx, stop := signal.NotifyContext(cmd.Context(), syscall.SIGINT, syscall.SIGTERM) defer stop() slog.Info("starting weimar", "host", cfg.Server.Host, "port", cfg.Server.Port) if err := srv.Start(ctx); err != nil { return fmt.Errorf("server error: %w", err) } return nil }, } func init() { rootCmd.AddCommand(serveCmd) serveCmd.Flags().StringVar(&adminEmail, "admin-email", "", "admin email for first-run setup") serveCmd.Flags().StringVar(&adminPassword, "admin-password", "", "admin password for first-run setup") viper.BindPFlag("server.host", serveCmd.Flags().Lookup("host")) viper.BindPFlag("server.port", serveCmd.Flags().Lookup("port")) }