Description
do continue discussion #1681 (comment)_
just finished porting older php app to go and there is one nice feature that PHP has - mapping ¶m[]=1¶m[]=2
to array [1,2]
. And looking at other binding APIs there are methods to bind params to native type ala Int64, Float64, Bool - these are also nice things that I always seems to implement as similar utility functions in my Echo apps.
ala
func ToValidInt64(input string, defaultValue int64) (int64, bool) {
if input == "" {
return defaultValue, true
}
n, err := strconv.Atoi(input)
if err != nil {
return 0, false
}
return int64(n), true
}
and use in handlers
length, ok := sanitizer.ToValidInt64(c.QueryParam("length"), 25)
if !ok {
return apperror.NewValidationError("length is not valid int64 value")
}
Maybe echo could have special func/structs for handling things like that. ala very short API for usage like that.
length := int64(25) // default value
var csv bool
var params []string
b := echo.BindQuery(c) // deals only with query params
if err := b.Int64(&length, "length"); err != nil {
return errors.wrap(err, "length is not valid int64 value")
}
if err := b.Bool(&csv, "csv"); err != nil {
return errors.wrap(err, "csv is not valid bool value")
}
// NB: go URL returns query params as list of values `c.Request().URL.Query()`
// but Echo `c.QueryParam("params[]")` returns single value so it is not possible in Echo
if err := b.SliceStrings(¶ms, "params[]"); err != nil {
return errors.wrap(err, "params contains invalid values")
}
// or name like that
if err := b.Int64s(&ids, "ids[]"); err != nil {
return errors.wrap(err, "ids contains invalid values")
}
or even this - fluent APIs are not very idiomatic go but for me I usually have bunch of query params that I need to bind and need to check for error (first) and return some meaningful message
// deals only with query params, returns on first error, error struct contains field name as separate member
err := echo.BindQuery(c).
Int64(&length, "length").
Bool(&csv, "csv").
Bind() // and ala BindErrs() that tries to bind all returns all errors
if err != nil {
return errors.Wrapf(err, "%s can not be bind", (err.(echo.BindError)).field)
}
I have not used any library for this kind of stuff but that later one is probably already implemented in some binding/validation or something-something library
this would be backwards compatible as it would not change existing interfaces (so could be released as 4.x minor version)
Originally posted by @aldas in #1681 (comment)