From d2308b5a1b4281ddff528ebb8c0692f5aa0732c1 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Wed, 5 Mar 2025 10:05:21 -0300 Subject: [PATCH] feat: hello world --- .gitignore | 2 ++ app.go | 16 --------- cmd/cmd.go | 77 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 6 +++- go.sum | 2 ++ go.work | 6 ++++ main.go | 17 ++-------- makefile | 72 ++++++++------------------------------- router/router.go | 29 ++++++++++++++++ templates/index.html | 11 ++++++ templates/templates.go | 0 x | 2 +- 12 files changed, 150 insertions(+), 90 deletions(-) create mode 100644 .gitignore delete mode 100644 app.go create mode 100644 cmd/cmd.go create mode 100644 go.work create mode 100644 router/router.go create mode 100644 templates/index.html delete mode 100644 templates/templates.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ed18ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +tmp +.dist diff --git a/app.go b/app.go deleted file mode 100644 index 80477e2..0000000 --- a/app.go +++ /dev/null @@ -1,16 +0,0 @@ -package capytalcodecomicverse - -import ( - "io/fs" - "net/http" -) - -type App struct { - templates fs.FS -} - -func NewApp(templates fs.FS) *App { - return &App{ - templates: templates, - } -} diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 0000000..3749511 --- /dev/null +++ b/cmd/cmd.go @@ -0,0 +1,77 @@ +package cmd + +import ( + "context" + "errors" + "flag" + "fmt" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + + "forge.capytal.company/capytalcode/project-comicverse/router" + "forge.capytal.company/loreddev/x/tinyssert" +) + +var ( + host = flag.String("host", "localhost", "Host to listen to") + port = flag.Uint("port", 8080, "Port to be used for the server.") + templatesDir = flag.String("templates", "", "Templates directory to be used instead of built-in ones.") + verbose = flag.Bool("verbose", false, "Print debug information on logs") + dev = flag.Bool("dev", false, "Run the server in debug mode.") +) + +func init() { + flag.Parse() +} + +func Execute() { + ctx := context.Background() + + assertions := tinyssert.NewDisabledAssertions() + if *dev { + assertions = tinyssert.NewAssertions() + } + + level := slog.LevelError + if *dev { + level = slog.LevelDebug + } else if *verbose { + level = slog.LevelInfo + } + log := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level})) + + app := router.New(assertions, log, *dev) + + srv := &http.Server{ + Addr: fmt.Sprintf("%s:%d", *host, *port), + Handler: app, + } + + c, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM) + defer stop() + + go func() { + log.Info("Starting application", + slog.String("host", *host), + slog.Uint64("port", uint64(*port)), + slog.Bool("verbose", *verbose), + slog.Bool("development", *dev)) + + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Error("Failed to start application", slog.String("error", err.Error())) + } + }() + + <-c.Done() + + log.Info("Stopping application gracefully") + if err := srv.Shutdown(ctx); err != nil { + log.Error("Failed to stop application gracefully", slog.String("error", err.Error())) + } + + log.Info("FINAL") + os.Exit(0) +} diff --git a/go.mod b/go.mod index 9dc3e01..907b8f7 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,7 @@ module forge.capytal.company/capytalcode/project-comicverse -go 1.22.7 +go 1.23.3 + +toolchain go1.23.6 + +require forge.capytal.company/loreddev/x v0.0.0-20250227192157-90a5169f1bef diff --git a/go.sum b/go.sum index e69de29..584376a 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,2 @@ +forge.capytal.company/loreddev/x v0.0.0-20250227192157-90a5169f1bef h1:IJ9z7otITB5hhjZ+bmU0yOVsa8K1RWYIZ+cQj9XF6NY= +forge.capytal.company/loreddev/x v0.0.0-20250227192157-90a5169f1bef/go.mod h1:MnU08vmXvYIQlQutVcC6o6Xq1KHZuXGXO78bbHseCFo= diff --git a/go.work b/go.work new file mode 100644 index 0000000..b5ffcb9 --- /dev/null +++ b/go.work @@ -0,0 +1,6 @@ +go 1.23.6 + +use ( + ./. + ./x +) diff --git a/main.go b/main.go index 650c2fd..288f701 100644 --- a/main.go +++ b/main.go @@ -1,18 +1,7 @@ -package capytalcodecomicverse +package main -import ( - "flag" -) - -var ( - debug = flag.Bool("dev", false, "Run the server in debug mode.") - port = flag.Int("port", 8080, "Port to be used for the server.") -) - -func init() { - flag.Parse() -} +import "forge.capytal.company/capytalcode/project-comicverse/cmd" func main() { - + cmd.Execute() } diff --git a/makefile b/makefile index 54e33ac..1842a37 100644 --- a/makefile +++ b/makefile @@ -1,75 +1,31 @@ - PORT?=8080 -lint: build/templ - go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.59.1 run - npx eslint . +lint: + golangci-lint run . -lint/fix: build/templ - go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.59.1 run - npx eslint --fix . - -fmt: build/templ - go fmt ./. - go run github.com/a-h/templ/cmd/templ@v0.2.707 fmt . - go run mvdan.cc/gofumpt@v0.7.0 -l -w . - go run github.com/segmentio/golines@v0.12.2 -w . - go run golang.org/x/tools/cmd/goimports@v0.26.0 -w -l . - -dev/templ: - go run github.com/a-h/templ/cmd/templ@v0.2.707 generate --watch \ - --proxy=http://localhost:$(PORT) \ - --proxybind="0.0.0.0" \ - --open-browser=false - -dev/server: - go run github.com/air-verse/air@v1.52.2 \ - --build.cmd "go build -o tmp/bin/main ." \ - --build.bin "tmp/bin/main" \ - --build.exclude_dir "node_modules" \ - --build.include_ext "go" \ - --build.stop_on_error "false" \ - --misc.clean_on_exit true \ - -- -dev -port $(PORT) - -dev/sync_assets: - go run github.com/air-verse/air@v1.52.2 \ - --build.cmd "go run github.com/a-h/templ/cmd/templ@v0.2.707 generate --notify-proxy" \ - --build.bin "true" \ - --build.delay "100" \ - --build.exclude_dir "" \ - --build.include_dir "static" \ - --build.include_ext "js,css" - -dev/assets/css: - npx unocss --watch +fmt: + go fmt . + golangci-lint run --fix . dev: go run github.com/joho/godotenv/cmd/godotenv@v1.5.1 \ - make -j4 dev/templ dev/server dev/sync_assets dev/assets/css + go run github.com/air-verse/air@v1.52.2 \ + --build.cmd "go build -o .tmp/bin/main ." \ + --build.bin ".tmp/bin/main" \ + --build.exclude_dir "node_modules" \ + --build.include_ext "go" \ + --build.stop_on_error "false" \ + --misc.clean_on_exit true \ + -- -dev -port $(PORT) -build/templ: - go run github.com/a-h/templ/cmd/templ@v0.2.707 generate -build/app: +build: go build -o ./.dist/app . -build/assets: - npx unocss - -build: build/templ build/assets build/app - run: build ./.dist/app clean: - # Remove templ generated files - find -type f -iname '*_templ.go' -delete \ - -o -type f -iname '*_templ.txt' -delete - - # Remove UnoCSS generated file - rm ./assets/css/uno.css - # Remove generated directories if [[ -d ".dist" ]]; then rm -r ./.dist; fi if [[ -d "tmp" ]]; then rm -r ./tmp; fi diff --git a/router/router.go b/router/router.go new file mode 100644 index 0000000..6af98fc --- /dev/null +++ b/router/router.go @@ -0,0 +1,29 @@ +package router + +import ( + "log/slog" + "net/http" + + "forge.capytal.company/loreddev/x/smalltrip" + "forge.capytal.company/loreddev/x/smalltrip/middleware" + "forge.capytal.company/loreddev/x/tinyssert" +) + +func New(assertions tinyssert.Assertions, log *slog.Logger, dev bool) http.Handler { + r := smalltrip.NewRouter(smalltrip.WithAssertions(assertions), smalltrip.WithLogger(log.WithGroup("smalltrip"))) + + r.Use(middleware.Logger(log.WithGroup("routes"))) + if dev { + log.Debug("Development mode activated, using development middleware") + r.Use(middleware.Dev) + } else { + r.Use(middleware.PersistentCache()) + } + + r.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("Hello world")) + }) + + return r +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..8fef075 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,11 @@ + + + + + + + +

Hello, world

+ + + diff --git a/templates/templates.go b/templates/templates.go deleted file mode 100644 index e69de29..0000000 diff --git a/x b/x index 90a5169..05619c3 160000 --- a/x +++ b/x @@ -1 +1 @@ -Subproject commit 90a5169f1befe58d86272b6d9b4d328e8d3f58d5 +Subproject commit 05619c382c40486aff3c10e9687a7b112b9f7298