-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathhelp.go
114 lines (95 loc) · 2.02 KB
/
help.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
package main
import (
"bytes"
"fmt"
"io"
)
var helpPage1 string = `<h1>Perso - Maildir to REST daemon</h1>
<ul>
<li>Available URLs:`
var helpPage2 string = `</li>
<li>N can be: (1) a number (ex: "1", "2", "135"), (2) a range (eg: "1-5", "8-9"), (3) a number with limit (eg "1,2": from the first, two elements; "6,3": from the sixth, three elements)
</li>
</ul>
<body>
</html>`
type help struct {
data []byte
keys indexKey
}
func newHelp(keys indexKey) *help {
return &help{
keys: keys,
}
}
func (h *help) reverseURLs() []string {
urls := make([]string, 0)
urls = append(urls, "/help")
for k, t := range h.keys {
if k == "" {
continue
}
urls = append(urls, "/"+k)
var url string
switch t {
case keyTypeAny:
continue
case keyTypeAddr:
url = fmt.Sprintf("/%s/EMAIL-ADDRESS", k)
case keyTypePart:
url = fmt.Sprintf("/%s/PARTIAL-HEADER-VALUE", k)
default:
if k != "" {
url = fmt.Sprintf("/%s/FULL-HEADER-VALUE", k)
}
}
if url != "" {
urls = append(urls, url)
}
urls = append(urls, url+"/latest/N")
urls = append(urls, url+"/oldest/N")
}
return urls
}
func (h *help) renderURLs(w io.Writer) error {
if _, err := fmt.Fprint(w, "<ul>"); err != nil {
return err
}
for _, url := range h.reverseURLs() {
if _, err := fmt.Fprintf(w, `<li><a href="%s">%s</a></li>`, url, url); err != nil {
return err
}
}
if _, err := fmt.Fprint(w, "</ul>"); err != nil {
return err
}
return nil
}
func (h *help) writeTitle(w io.Writer) error {
if _, err := fmt.Fprint(w, "Perso - Help"); err != nil {
return err
}
return nil
}
func (h *help) renderHelp(w io.Writer) error {
if _, err := fmt.Fprint(w, helpPage1); err != nil {
return err
}
if err := h.renderURLs(w); err != nil {
return err
}
if _, err := fmt.Fprint(w, helpPage2); err != nil {
return err
}
return nil
}
func (h *help) writeContent(w io.Writer) error {
if h.data == nil {
var b bytes.Buffer
h.renderHelp(&b)
h.data = b.Bytes()
}
r := bytes.NewReader(h.data)
_, err := io.Copy(w, r)
return err
}