-
Notifications
You must be signed in to change notification settings - Fork 0
/
web_spa.go
126 lines (96 loc) · 2.88 KB
/
web_spa.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package server
import (
"fmt"
"io/fs"
"net/http"
"alox.sh/webpage"
)
type SPAHandler func(*SPA, http.ResponseWriter, *http.Request)
type SPAParams struct {
FS fs.FS
FSKey string
InputHTMLName string
HydrateWebpage func(*SPA, http.ResponseWriter, *http.Request, *webpage.Webpage)
}
type SPA struct {
*Web
SPAParams
}
func NewSPA(handler SPAHandler, params SPAParams) (spa *SPA, err error) {
var (
inputHTMLFile fs.File
inputHTMLFileStat fs.FileInfo
)
spa = &SPA{
SPAParams: params,
Web: NewWeb(func(_ *Web, responseWriter http.ResponseWriter, request *http.Request) {
if handler == nil {
spa.WriteFileOrWebpage(responseWriter, request)
return
}
handler(spa, responseWriter, request)
}),
}
if spa.FSKey == "" {
spa.FSKey = "root"
}
if spa.InputHTMLName == "" {
spa.InputHTMLName = "index.html"
}
spa.Web.FS[spa.FSKey] = params.FS
if inputHTMLFile, err = params.FS.Open(spa.InputHTMLName); err != nil {
return
}
if inputHTMLFileStat, err = inputHTMLFile.Stat(); err != nil {
return
}
if !inputHTMLFileStat.Mode().IsRegular() {
err = fmt.Errorf("input HTML file '%s' is irregular file", spa.InputHTMLName)
return
}
if spa.Webpages[spa.InputHTMLName], err = webpage.NewWebpage(inputHTMLFile); err != nil {
return
}
return
}
func (spa *SPA) Webpage() *webpage.Webpage {
return spa.Web.Webpage(spa.InputHTMLName)
}
func (spa *SPA) WriteFile(responseWriter http.ResponseWriter, request *http.Request) (err error) {
if spa.Web.FS[spa.FSKey] == nil {
return fmt.Errorf("invalid FS '%s'", spa.FSKey)
}
return spa.Web.WriteFile(responseWriter, spa.FSKey, request.URL.Path)
}
func (spa *SPA) MustWriteFile(responseWriter http.ResponseWriter, request *http.Request) {
if err := spa.WriteFile(responseWriter, request); err != nil {
spa.HandleError(responseWriter, request, err)
}
}
// webpage := spa.Webpage(spa.InputHTMLName)
// if spa.FS["root"] == nil || webpage == nil {
// spa.HandleError(responseWriter, request, fmt.Errorf("Invalid SPA"))
// return
// }
// if spa.HydrateWebpage != nil {
// spa.HydrateWebpage(spa, responseWriter, request, webpage)
// }
// spa.WriteWebpage(responseWriter, request, webpage)
func (spa *SPA) WriteWebpage(responseWriter http.ResponseWriter, request *http.Request) (err error) {
webpage := spa.Webpage()
if webpage == nil {
return fmt.Errorf("invalid webpage '%s'", spa.InputHTMLName)
}
return spa.Web.WriteWebpage(responseWriter, request, webpage)
}
func (spa *SPA) MustWriteWebpage(responseWriter http.ResponseWriter, request *http.Request) {
if err := spa.WriteWebpage(responseWriter, request); err != nil {
spa.HandleError(responseWriter, request, err)
}
}
func (spa *SPA) WriteFileOrWebpage(responseWriter http.ResponseWriter, request *http.Request) {
if err := spa.WriteFile(responseWriter, request); err == nil {
return
}
spa.MustWriteWebpage(responseWriter, request)
}