-
Notifications
You must be signed in to change notification settings - Fork 6
/
builder.go
72 lines (62 loc) · 1.51 KB
/
builder.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
// package url contains url utilities beyond what is available in the net/url package
package url
import (
"fmt"
url2 "net/url"
)
// Builder uses a builder pattern to create a URL.
type Builder struct {
url *url2.URL
values url2.Values
}
// NewBuilder starts a URL builder from a basic path.
func NewBuilder(path string) *Builder {
b := &Builder{}
var err error
b.url, err = url2.Parse(path)
if err != nil {
panic(err)
}
b.values = b.url.Query()
return b
}
// NewBuilderFromUrl creates a new builder from a URL.
func NewBuilderFromUrl(u *url2.URL) *Builder {
b := &Builder{url: u}
b.values, _ = url2.ParseQuery(u.RawQuery)
return b
}
// SetValue sets the GET value in the URL
func (u *Builder) SetValue(k string, v any) *Builder {
value := fmt.Sprint(v)
u.values.Set(k, value)
return u
}
// SetValues sets the GET values in the URL from a map
func (u *Builder) SetValues(m map[string]any) *Builder {
for k, v := range m {
value := fmt.Sprint(v)
u.values.Set(k, value)
}
return u
}
// RemoveValue removes the value from the URL
func (u *Builder) RemoveValue(k string) *Builder {
u.values.Del(k)
return u
}
// SetFragment sets the fragment portion of the URL
func (u *Builder) SetFragment(f string) *Builder {
u.url.Fragment = f
return u
}
// ClearFragment removes the fragment from the URL.
func (u *Builder) ClearFragment() *Builder {
u.url.Fragment = ""
return u
}
// String returns the encoded URL.
func (u *Builder) String() string {
u.url.RawQuery = u.values.Encode()
return u.url.String()
}