282 lines
5.3 KiB
Go
282 lines
5.3 KiB
Go
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 <targetDir>\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)
|
|
}
|
|
}
|