@@ -4,19 +4,79 @@ import (
44 "embed"
55 "fmt"
66 "io/fs"
7+ "log"
78 "net/http"
9+ "strings"
10+ "text/template"
811)
912
10- //go:generate cp -r ../../web/static/ ./assets
11- //go:embed assets/index.html
12- //go:embed assets/js/client.js
13- var assets embed.FS
13+ //go:generate mkdir -p assets
14+ //go:generate cp -r ../../web/static/ ./assets/static
15+ //go:generate cp -r ../../web/templates/ ./assets/templates
1416
15- func fileServer () (http.Handler , error ) {
16- fsys , err := fs .Sub (assets , "assets" )
17+ var (
18+ //go:embed assets/static
19+ staticFS embed.FS
20+ staticDir string = "assets/static"
21+
22+ //go:embed assets/templates
23+ templatesFS embed.FS
24+ templatesDir string = "assets/templates"
25+ )
26+
27+ func staticFileServer () (http.Handler , error ) {
28+ fsys , err := fs .Sub (staticFS , staticDir )
1729 if err != nil {
1830 return nil , fmt .Errorf ("error creating filesystem subtree: %w" , err )
1931 }
2032
2133 return http .FileServer (http .FS (fsys )), nil
2234}
35+
36+ type Style struct {
37+ Name string
38+ Variant string
39+ }
40+
41+ func rootHandler (s string ) http.Handler {
42+ unpack := func (vals []string , vars ... * string ) {
43+ for i , val := range vals {
44+ * vars [i ] = val
45+ }
46+ }
47+
48+ var style Style
49+ unpack (strings .Split (s , ":" ), & style .Name , & style .Variant )
50+
51+ return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
52+ if r .URL .Path != "/" {
53+ http .NotFound (w , r )
54+ return
55+ }
56+
57+ templateFiles := []string {
58+ templatesDir + "/" + "index.html" ,
59+ templatesDir + "/" + "styles" + "/" + style .Name + ".html" ,
60+ }
61+
62+ ts , err := template .ParseFS (templatesFS , templateFiles ... )
63+ if err != nil {
64+ log .Println (err .Error ())
65+ status := http .StatusInternalServerError
66+ http .Error (w , http .StatusText (status ), status )
67+ return
68+ }
69+
70+ data := struct {
71+ Style Style
72+ }{
73+ Style : style ,
74+ }
75+ if err := ts .Execute (w , data ); err != nil {
76+ log .Println (err .Error ())
77+ status := http .StatusInternalServerError
78+ http .Error (w , http .StatusText (status ), status )
79+ return
80+ }
81+ })
82+ }
0 commit comments