package main import ( "bufio" "fmt" "os" "os/exec" "strings" "github.com/charmbracelet/huh" ) type Middleware struct { Name string Url string } var middlewares = []Middleware{ { Name: "Adaptor", Url: "github.com/gofiber/fiber/v3/middleware/adaptor", }, { Name: "BasicAuth", Url: "github.com/gofiber/fiber/v3/middleware/basicauth", }, { Name: "Cache", Url: "github.com/gofiber/fiber/v3/middleware/cache", }, { Name: "Compress", Url: "github.com/gofiber/fiber/v3/middleware/compress", }, { Name: "Cors", Url: "github.com/gofiber/fiber/v3/middleware/cors", }, { Name: "CSRF", Url: "github.com/gofiber/fiber/v3/middleware/csrf", }, { Name: "EarlyData", Url: "github.com/gofiber/fiber/v3/middleware/earlydata", }, { Name: "EncryptCookie", Url: "github.com/gofiber/fiber/v3/middleware/encryptcookie", }, { Name: "EnvVar", Url: "github.com/gofiber/fiber/v3/middleware/envvar", }, { Name: "Etag", Url: "github.com/gofiber/fiber/v3/middleware/etag", }, { Name: "ExpVar", Url: "github.com/gofiber/fiber/v3/middleware/expvar", }, { Name: "Favicon", Url: "github.com/gofiber/fiber/v3/middleware/favicon", }, { Name: "Health Check", Url: "github.com/gofiber/fiber/v3/middleware/healthcheck", }, { Name: "Helmet", Url: "github.com/gofiber/fiber/v3/middleware/helmet", }, { Name: "Idempotency", Url: "github.com/gofiber/fiber/v3/middleware/idempotency", }, { Name: "KeyAuth", Url: "github.com/gofiber/fiber/v3/middleware/keyauth", }, { Name: "Limiter", Url: "github.com/gofiber/fiber/v3/middleware/limiter", }, { Name: "Logger", Url: "github.com/gofiber/fiber/v3/middleware/logger", }, { Name: "Monitor", Url: "github.com/gofiber/fiber/v3/middleware/monitor", }, { Name: "Pprof", Url: "github.com/gofiber/fiber/v3/middleware/pprof", }, { Name: "Proxy", Url: "github.com/gofiber/fiber/v3/middleware/proxy", }, { Name: "Recover", Url: "github.com/gofiber/fiber/v3/middleware/recover", }, { Name: "Redirect", Url: "github.com/gofiber/fiber/v3/middleware/redirect", }, { Name: "RequestID", Url: "github.com/gofiber/fiber/v3/middleware/requestid", }, { Name: "Rewrite", Url: "github.com/gofiber/fiber/v3/middleware/rewrite", }, { Name: "Session", Url: "github.com/gofiber/fiber/v3/middleware/session", }, { Name: "Skip", Url: "github.com/gofiber/fiber/v3/middleware/skip", }, { Name: "Static", Url: "github.com/gofiber/fiber/v3/middleware/static", }, { Name: "Timeout", Url: "github.com/gofiber/fiber/v3/middleware/timeout", }, } func main() { if len(os.Args) < 2 { fmt.Printf("Usage: %s \n", os.Args[0]) os.Exit(1) } targetDir := os.Args[1] cmd := exec.Command("go", "get", "-u", "github.com/gofiber/fiber/v3") cmd.Dir = targetDir err := cmd.Run() if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } options := []huh.Option[Middleware]{} for _, m := range middlewares { options = append(options, huh.NewOption(m.Name, m)) } selectedMiddlewares := make([]Middleware, 0) form := huh.NewForm( huh.NewGroup( huh.NewMultiSelect[Middleware](). Title("Middlewares"). Options( options..., ). Value(&selectedMiddlewares), ), ) err = form.Run() if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } os.Remove("main.go") goMod, err := os.Open("go.mod") if err != nil { fmt.Printf("Error: erratic directory structure\n") os.Exit(1) } defer goMod.Close() moduleName := "" scanner := bufio.NewScanner(goMod) for scanner.Scan() { if strings.HasPrefix(scanner.Text(), "module ") { moduleName = strings.TrimSpace(strings.TrimPrefix(scanner.Text(), "module ")) break } } if moduleName == "" { fmt.Printf("Error: could not find module name in go.mod\n") os.Exit(1) } goMain, err := os.Create("main.go") if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } defer goMain.Close() err = goMain.Truncate(0) if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } _, err = goMain.Seek(0, 0) if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } middlewaresImport := "" middlewaresUse := "" for i, middleware := range selectedMiddlewares { if i == 0 { middlewaresUse += "\n" } middlewaresUse += fmt.Sprintf("\tapp.Use(%s.New())\n", strings.ReplaceAll(strings.ToLower(middleware.Name), " ", "")) middlewaresImport += fmt.Sprintf("\t\"%s\"\n", middleware.Url) if i == len(selectedMiddlewares)-1 { middlewaresUse += "\n" } } os.MkdirAll("internal/handlers", 0755) handlers, err := os.Create("internal/handlers/time.go") if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } defer handlers.Close() _, err = handlers.WriteString(`package handlers import ( "fmt" "time" "github.com/gofiber/fiber/v3" ) func Time(c fiber.Ctx) error { return c.SendString(fmt.Sprintf("The time is %s", time.Now().Format(time.RFC1123))) } `) if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } _, err = goMain.WriteString(fmt.Sprintf(`package main import ( "github.com/gofiber/fiber/v3" %s "%s/internal/handlers" ) func main() { app := fiber.New() %s app.Get("/", handlers.Time) app.Listen(":3000") } `, middlewaresImport, moduleName, middlewaresUse)) if err != nil { fmt.Printf("Error: %s\n", err) os.Exit(1) } }