forked from bpicode/fritzctl
/
fritzapi_constants.go
71 lines (58 loc) · 1.72 KB
/
fritzapi_constants.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
package fritz
import (
"fmt"
"net/url"
"strings"
"github.com/gotohr/fritzctl/config"
"github.com/gotohr/fritzctl/internal/stringutils"
)
const (
homeAutomationURI = "/webservices/homeautoswitch.lua"
queryURI = "/query.lua"
inetStatURI = "/internet/inetstat_monitor.lua"
phoneListURI = "/fon_num/foncalls_list.lua"
systemStatusURI = "/cgi-bin/system_status"
)
type fritzURLBuilder interface {
query(key, value string) fritzURLBuilder
path(ps ...string) fritzURLBuilder
build() string
}
type fritzURLBuilderImpl struct {
target *target
queryParams queryParams
paths []string
}
type target struct {
protocol string
host string
port string
}
func (t *target) String() string {
return fmt.Sprintf("%s://%s%s", t.protocol, t.host, stringutils.DefaultIf(":"+t.port, "", ":"))
}
type queryParams map[string]string
func (qs queryParams) String() string {
joined := "?" + strings.Join(stringutils.Contract(qs, func(k, v string) string {
return k + "=" + v
}), "&")
return stringutils.DefaultIf(joined, "", "?")
}
func (fb *fritzURLBuilderImpl) build() string {
t := fb.target
path := t.String() + strings.Replace("/"+strings.Join(fb.paths, "/"), "//", "/", -1)
qs := fb.queryParams.String()
return path + qs
}
func (fb *fritzURLBuilderImpl) query(key, value string) fritzURLBuilder {
fb.queryParams[url.QueryEscape(key)] = url.QueryEscape(value)
return fb
}
func (fb *fritzURLBuilderImpl) path(ps ...string) fritzURLBuilder {
fb.paths = append(fb.paths, ps...)
return fb
}
func newURLBuilder(cfg *config.Config) fritzURLBuilder {
t := &target{protocol: cfg.Net.Protocol, host: cfg.Net.Host, port: cfg.Net.Port}
return &fritzURLBuilderImpl{target: t, queryParams: queryParams{}}
}