ss/urlenc/build.go

72 lines
1.1 KiB
Go
Raw Normal View History

2024-05-29 21:55:59 +03:00
package urlenc
import "fmt"
import "net/url"
2024-05-29 21:55:59 +03:00
type Values = url.Values
type Builder interface {
BuildQueryValues() Values
}
type Value[V any] struct {
2024-05-29 21:55:59 +03:00
Name string
2024-05-29 22:59:36 +03:00
Value V
}
func (value Value[V]) BuildQueryValues() Values {
values := Values{}
values.Add(
value.Name,
fmt.Sprintf("%v", value.Value),
)
return values
}
func (value Value[V]) String() string {
unesc, err := url.QueryUnescape(
value.BuildQueryValues().Encode(),
)
if err != nil {
panic(err)
}
return unesc
2024-05-29 21:55:59 +03:00
}
type Array[V any] struct {
Name string
Values []V
}
func (a Array[V]) BuildQueryValues() Values {
values := Values{}
2024-05-29 21:55:59 +03:00
for i, v := range a.Values {
values.Add(
fmt.Sprintf("%s[%d]", a.Name, i),
fmt.Sprintf("%v", v),
)
}
return values
}
func (a Array[V]) String() string {
unesc, err := url.QueryUnescape(
a.BuildQueryValues().Encode(),
)
if err != nil {
panic(err)
2024-05-29 21:55:59 +03:00
}
return unesc
2024-05-29 21:55:59 +03:00
}
func Join(builders ...Builder) Values {
ret := Values{}
for _, builder := range builders {
for k, v := range builder.BuildQueryValues() {
for _, jv := range v {
ret.Add(k, jv)
}
}
2024-05-29 22:59:36 +03:00
}
return ret
2024-05-29 22:59:36 +03:00
}