-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.go
96 lines (76 loc) · 1.79 KB
/
model.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
package renderer
import (
"fmt"
"net/http"
"net/url"
"sort"
"github.com/ViBiOh/httputils/v4/pkg/hash"
)
type TemplateFunc = func(http.ResponseWriter, *http.Request) (Page, error)
type Page struct {
Content map[string]any
Template string
Status int
}
func NewPage(template string, status int, content map[string]any) Page {
return Page{
Template: template,
Status: status,
Content: content,
}
}
func (p Page) etag() string {
streamer := hash.Stream()
streamer.WriteString(p.Template)
streamer.Write(p.Status)
keys := make([]string, 0, len(p.Content))
for key := range p.Content {
index := sort.Search(len(keys), func(i int) bool {
return keys[i] >= key
})
keys = append(keys, key)
copy(keys[index+1:], keys[index:])
keys[index] = key
}
for _, key := range keys {
streamer.WriteString(key)
switch typedValue := p.Content[key].(type) {
case string:
streamer.WriteString(typedValue)
case []byte:
streamer.WriteBytes(typedValue)
default:
streamer.Write(typedValue)
}
}
return streamer.Sum()
}
type Message struct {
Level string
Content string
}
func newMessage(level, format string, a ...any) Message {
return Message{
Level: level,
Content: fmt.Sprintf(format, a...),
}
}
func (m Message) String() string {
if len(m.Content) == 0 {
return ""
}
return fmt.Sprintf("messageContent=%s&messageLevel=%s", url.QueryEscape(m.Content), url.QueryEscape(m.Level))
}
func ParseMessage(r *http.Request) Message {
values := r.URL.Query()
return Message{
Level: values.Get("messageLevel"),
Content: values.Get("messageContent"),
}
}
func NewSuccessMessage(format string, a ...any) Message {
return newMessage("success", format, a...)
}
func NewErrorMessage(format string, a ...any) Message {
return newMessage("error", format, a...)
}