feat: hello world
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
tmp
|
||||
.dist
|
||||
16
app.go
16
app.go
@@ -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,
|
||||
}
|
||||
}
|
||||
77
cmd/cmd.go
Normal file
77
cmd/cmd.go
Normal file
@@ -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)
|
||||
}
|
||||
6
go.mod
6
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
|
||||
|
||||
2
go.sum
2
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=
|
||||
|
||||
17
main.go
17
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()
|
||||
}
|
||||
|
||||
72
makefile
72
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
|
||||
|
||||
29
router/router.go
Normal file
29
router/router.go
Normal file
@@ -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
|
||||
}
|
||||
11
templates/index.html
Normal file
11
templates/index.html
Normal file
@@ -0,0 +1,11 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Hello, world</h1>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
2
x
2
x
Submodule x updated: 90a5169f1b...05619c382c
Reference in New Issue
Block a user