iperf3exporter/vendor/github.com/DisgoOrg/restclient/route.go
Marvin Preuss 2343c9588a
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
first commit
2021-10-20 10:08:56 +02:00

110 lines
2.6 KiB
Go

package restclient
import (
"errors"
"fmt"
"net/url"
"strconv"
"strings"
)
// QueryValues is used to supply query param value pairs to Route.Compile
type QueryValues map[string]interface{}
func newRoute(baseRoute string, url string, queryParams []string) *Route {
params := map[string]struct{}{}
for _, param := range queryParams {
params[param] = struct{}{}
}
return &Route{
baseRoute: baseRoute,
route: url,
queryParams: params,
urlParamCount: countURLParams(url),
}
}
// Route the base struct for routes used in disgo
type Route struct {
baseRoute string
route string
queryParams map[string]struct{}
urlParamCount int
}
// Compile builds a full request URL based on provided arguments
func (r *Route) Compile(queryValues QueryValues, args ...interface{}) (*CompiledRoute, error) {
if len(args) != r.urlParamCount {
return nil, errors.New("invalid amount of arguments received. expected: " + strconv.Itoa(len(args)) + ", received: " + strconv.Itoa(r.urlParamCount))
}
route := r.route
if len(args) > 0 {
for _, arg := range args {
start := strings.Index(route, "{")
end := strings.Index(route, "}")
route = route[:start] + fmt.Sprint(arg) + route[end+1:]
}
}
compiledRoute := r.baseRoute + route
queryParamsStr := ""
if queryValues != nil {
query := url.Values{}
for param, value := range queryValues {
if _, ok := r.queryParams[param]; !ok {
return nil, errors.New("unexpected query param '" + param + "' received")
}
query.Add(param, fmt.Sprint(value))
}
if len(query) > 0 {
queryParamsStr = query.Encode()
}
}
return &CompiledRoute{route: compiledRoute, queryParams: queryParamsStr}, nil
}
// NewRoute generates a Route when given a URL
func NewRoute(url string, queryParams ...string) *Route {
params := map[string]struct{}{}
for _, param := range queryParams {
params[param] = struct{}{}
}
return &Route{
baseRoute: "",
route: url,
queryParams: params,
urlParamCount: countURLParams(url),
}
}
func countURLParams(url string) int {
paramCount := strings.Count(url, "{")
return paramCount
}
// CompiledRoute is Route compiled with all URL args
type CompiledRoute struct {
route string
queryParams string
}
// URL returns the full request URL
func (r *CompiledRoute) URL() string {
route := r.route
if r.queryParams != "" {
route += "?" + r.queryParams
}
return route
}
// Route returns the request route
func (r *CompiledRoute) Route() string {
return r.route
}
// QueryParams returns the request query params
func (r *CompiledRoute) QueryParams() string {
return r.route
}