diff --git a/cmd/build-static/main.go b/cmd/build-static/main.go deleted file mode 100644 index d3cd7ea..0000000 --- a/cmd/build-static/main.go +++ /dev/null @@ -1,115 +0,0 @@ -package main - -import ( - "context" - "flag" - "io" - "io/fs" - "log" - "os" - "path/filepath" - "strings" - - "github.com/a-h/templ" - "guz.one/pages" -) - -const PERMISSIONS = 0755 - -type Page struct { - path string - component templ.Component -} - -type Writer struct { - root *string - pages []Page - context context.Context -} - -func (w Writer) writeFile(path string, writer func(ctx context.Context, w io.Writer) error) { - directory := filepath.Dir(path) - err := os.MkdirAll(directory, PERMISSIONS) - if err != nil { - log.Fatal(err) - } - - f, err := os.Create(path) - if err != nil { - log.Fatal(err) - } - defer f.Close() - - err = writer(w.context, f) - if err != nil { - log.Fatal(err) - } -} - -func (w Writer) WriteAll() { - for _, page := range w.pages { - p := filepath.Join(*w.root, page.path) - log.Printf("Writing page %s", p) - w.writeFile(p, page.component.Render) - } -} - -func main() { - dir := flag.String("d", "./dist", "the directory to write the files") - staticDir := flag.String("s", "./static", "the directory to copy static files from") - - pages := []Page{ - {"index.html", pages.Homepage()}, - } - w := Writer{dir, pages, context.Background()} - w.WriteAll() - - a, err := filepath.Abs(*staticDir) - if err != nil { - log.Fatal(err) - } - - copyFile := func(root string, dest *string) func(string, fs.DirEntry, error) error { - return func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } else if path == root { - return nil - } - - c, err := os.ReadFile(path) - if err != nil { - return err - } - - p := strings.TrimPrefix(path, root) - log.Printf("Copying static file %s to %s directory", p, *dest) - - p = filepath.Join(*dest, p) - - err = os.MkdirAll(filepath.Dir(p), PERMISSIONS) - if err != nil { - return err - } - - f, err := os.Create(p) - if err != nil { - return err - } - defer f.Close() - - b, err := f.Write(c) - if err != nil { - return err - } - log.Printf("Wrote %v bytes in %s", b, p) - - return nil - } - } - err = filepath.WalkDir(a, copyFile(a, dir)) - if err != nil { - log.Fatal(err) - } - -} diff --git a/cmd/build/main.go b/cmd/build/main.go new file mode 100644 index 0000000..f61de39 --- /dev/null +++ b/cmd/build/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "context" + "flag" + "log" + + "guz.one/internals" +) + +func main() { + dir := flag.String("d", "./dist", "the directory to write the files") + staticDir := flag.String("s", "./static", "the directory to copy static files from") + + w := internals.StaticWriter{ + DistDir: dir, + StaticDir: staticDir, + Pages: internals.ROUTES, + Context: context.Background(), + Logger: *log.Default(), + } + + err := w.WriteAll() + if err != nil { + log.Fatal(err) + } +} diff --git a/config/routes.go b/config/routes.go new file mode 100644 index 0000000..646f7f8 --- /dev/null +++ b/config/routes.go @@ -0,0 +1,17 @@ +package config + +import ( + "net/http" + + "guz.one/api" + "guz.one/internals" + "guz.one/pages" +) + +var ROUTES = []internals.Page{ + {Path: "index.html", Component: pages.Homepage()}, +} + +func APIROUTES(mux *http.ServeMux) { + mux.HandleFunc("/api/hello", api.Hello) +} diff --git a/internals/static_writer.go b/internals/static_writer.go new file mode 100644 index 0000000..976a1a7 --- /dev/null +++ b/internals/static_writer.go @@ -0,0 +1,107 @@ +package internals + +import ( + "context" + "io" + "io/fs" + "log" + "os" + "path/filepath" + "strings" + + "github.com/a-h/templ" +) + +const PERMISSIONS = 0755 + +type Page struct { + Path string + Component templ.Component +} + +type StaticWriter struct { + DistDir *string + StaticDir *string + Pages []Page + Context context.Context + Logger log.Logger +} + +func (w *StaticWriter) WritePage(path string, writer func(ctx context.Context, w io.Writer) error) error { + directory := filepath.Dir(path) + err := os.MkdirAll(directory, PERMISSIONS) + if err != nil { + return err + } + + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + + err = writer(w.Context, f) + return err +} + +func (w *StaticWriter) WriteAll() error { + for _, page := range w.Pages { + p := filepath.Join(*w.DistDir, page.Path) + w.Logger.Printf("Writing page %s", p) + err := w.WritePage(p, page.Component.Render) + if err != nil { + return err + } + } + + err := filepath.WalkDir(*w.StaticDir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } else if d.IsDir() || path == *w.StaticDir { + return nil + } + + f, err := filepath.Abs(path) + if err != nil { + return err + } + s, err := filepath.Abs(*w.StaticDir) + if err != nil { + return err + } + + err = w.CopyStatic(strings.TrimPrefix(f, s)) + if err != nil { + return err + } + return nil + }) + return err +} + +func (w *StaticWriter) CopyStatic(path string) error { + c, err := os.ReadFile(filepath.Join(*w.StaticDir, path)) + if err != nil { + return err + } + + p := filepath.Join(*w.DistDir, path) + err = os.MkdirAll(filepath.Dir(p), PERMISSIONS) + if err != nil { + return err + } + + f, err := os.Create(p) + if err != nil { + return err + } + defer f.Close() + + b, err := f.Write(c) + if err != nil { + return err + } + w.Logger.Printf("Wrote %v bytes in %s", b, p) + + return nil +} diff --git a/vercel.json b/vercel.json index 89db77a..1a28888 100644 --- a/vercel.json +++ b/vercel.json @@ -2,3 +2,4 @@ "$schema": "https://openapi.vercel.sh/vercel.json", "outputDirectory": "dist" } +