Files
zqdgr-fiber-starter/main.go
2025-01-23 17:07:23 +00:00

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)
}
}