// 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 }