All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
// query_bind.go binds endpoint query parameters into typed request config.
|
|
// Layer: adapters/inbound/httpapi request binding.
|
|
package httpapi
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"gitea.maximumdirect.net/ejr/feedapi/bind"
|
|
"gitea.maximumdirect.net/ejr/weatherapi/internal/adapters/inbound/httpapi/presenter"
|
|
)
|
|
|
|
type queryRequest struct {
|
|
Units presenter.Units
|
|
}
|
|
|
|
type precisionQueryRequest struct {
|
|
Units presenter.Units
|
|
Precision int
|
|
}
|
|
|
|
func bindQuery(r *http.Request) (queryRequest, error) {
|
|
normalizeCommonQueryValue(r, "units")
|
|
normalizeCommonQueryValue(r, "format")
|
|
|
|
common, err := bind.CommonQueryParams(r, bind.QueryPolicy{
|
|
AllowUnits: true,
|
|
AllowFormat: true,
|
|
DefaultUnits: string(presenter.UnitsMetric),
|
|
RejectUnknown: true,
|
|
})
|
|
if err != nil {
|
|
return queryRequest{}, err
|
|
}
|
|
|
|
units := presenter.Units(strings.ToLower(strings.TrimSpace(common.Units)))
|
|
if units == "" {
|
|
units = presenter.UnitsMetric
|
|
}
|
|
return queryRequest{Units: units}, nil
|
|
}
|
|
|
|
func bindPrecisionQuery(r *http.Request) (precisionQueryRequest, error) {
|
|
normalizeCommonQueryValue(r, "units")
|
|
normalizeCommonQueryValue(r, "format")
|
|
normalizeCommonQueryValue(r, "precision")
|
|
|
|
common, err := bind.CommonQueryParams(r, bind.QueryPolicy{
|
|
AllowUnits: true,
|
|
AllowFormat: true,
|
|
DefaultUnits: string(presenter.UnitsMetric),
|
|
RejectUnknown: true,
|
|
}, "precision")
|
|
if err != nil {
|
|
return precisionQueryRequest{}, err
|
|
}
|
|
|
|
precision, err := bind.OptionalInt(r, "precision", 0)
|
|
if err != nil {
|
|
return precisionQueryRequest{}, err
|
|
}
|
|
if err := bind.MinInt(precision, 0, "precision"); err != nil {
|
|
return precisionQueryRequest{}, err
|
|
}
|
|
if err := bind.MaxInt(precision, 2, "precision"); err != nil {
|
|
return precisionQueryRequest{}, err
|
|
}
|
|
|
|
units := presenter.Units(strings.ToLower(strings.TrimSpace(common.Units)))
|
|
if units == "" {
|
|
units = presenter.UnitsMetric
|
|
}
|
|
return precisionQueryRequest{Units: units, Precision: precision}, nil
|
|
}
|