diff options
| author | alex emery <[email protected]> | 2024-11-03 15:33:28 +0000 |
|---|---|---|
| committer | alex emery <[email protected]> | 2024-11-03 15:33:28 +0000 |
| commit | 508527f52de524a4fd174d386808e314b4138b11 (patch) | |
| tree | 2593af258b67decbf0207e2547b7ea55f6b051d7 /cmd | |
| parent | 22bfae8f9637633d5608caad3ce56b64c6819505 (diff) | |
feat: static builds
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/build/main.go | 57 | ||||
| -rw-r--r-- | cmd/home/main.go | 2 | ||||
| -rw-r--r-- | cmd/serve/main.go | 63 |
3 files changed, 121 insertions, 1 deletions
diff --git a/cmd/build/main.go b/cmd/build/main.go new file mode 100644 index 0000000..9c5cd15 --- /dev/null +++ b/cmd/build/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "errors" + "fmt" + "log" + "os" + "path" + + "git.sr.ht/~a73x/home/pages" +) + +func main() { + if err := Run(); err != nil { + log.Fatal(err) + } +} + +func Run() error { + pages, err := pages.Collect("content") + if err != nil { + return err + } + + var errs []error + for _, page := range pages { + err = writeFile(path.Join("public", page.Path), []byte(page.Content)) + if err != nil { + errs = append(errs, err) + } + } + + if errs != nil { + return errors.Join(errs...) + } + + return nil +} + +func writeFile(name string, contents []byte) error { + folders := path.Dir(name) + _, err := os.Stat(folders) + if os.IsNotExist(err) { + if err := os.MkdirAll(folders, 0744); err != nil { + return fmt.Errorf("failed to mkdir %s\n%w", folders, err) + } + } else if err != nil { + return fmt.Errorf("failed to stat folder %s\n%w", folders, err) + } + + err = os.WriteFile(name, contents, 0666) + if err != nil { + return fmt.Errorf("failed to write file %s\n%w", name, err) + } + + return nil +} diff --git a/cmd/home/main.go b/cmd/home/main.go index 9dc5cc6..3f04b39 100644 --- a/cmd/home/main.go +++ b/cmd/home/main.go @@ -16,7 +16,7 @@ func main() { logger.Fatal("failed to start webserver", zap.Error(err)) } - done := make(chan os.Signal, 1) + done := make(chan os.Signal, 0) signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) logger.Info("Starting web server") diff --git a/cmd/serve/main.go b/cmd/serve/main.go new file mode 100644 index 0000000..9ce15cd --- /dev/null +++ b/cmd/serve/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "log" + "net/http" + "path/filepath" + "strings" + "time" + + "git.sr.ht/~a73x/home/public" + "go.uber.org/zap" +) + +func main() { + if err := Run(); err != nil { + log.Fatal(err) + } +} + +func Run() error { + logger, err := zap.NewProduction() + if err != nil { + return err + } + + loggingMiddleware := func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + next.ServeHTTP(w, r) + logger.Info("request received", + zap.String("url", r.URL.Path), + zap.String("method", r.Method), + zap.Duration("duration", time.Since(start)), + zap.String("user-agent", r.UserAgent()), + ) + }) + } + + mux := http.NewServeMux() + + mux.HandleFunc("GET /", serveFile) + + server := http.Server{ + Addr: ":8080", + Handler: loggingMiddleware(mux), + } + + return server.ListenAndServe() +} + +func serveFile(w http.ResponseWriter, r *http.Request) { + fsPath := strings.TrimRight(r.URL.Path, "/") + + if fsPath == "" { + fsPath = "index" + } + + if ext := filepath.Ext(fsPath); ext == "" { + fsPath += ".html" + } + + http.ServeFileFS(w, r, public.FS, fsPath) +} |
