use json encoding for route body parameters, implement modify user/group/pool operations, simplify schema by using comon lib struct tags and RequireAll and AtLeastOne helper functions, properly implement locadb as Backend interface
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// RequireAll ensures that EVERY non-excluded exported field in the struct is non-zero.
|
||||
func RequireAll(v any, excludes ...string) bool {
|
||||
val := reflect.ValueOf(v)
|
||||
if val.Kind() == reflect.Pointer {
|
||||
val = val.Elem()
|
||||
}
|
||||
typ := val.Type()
|
||||
|
||||
excludeMap := make(map[string]bool)
|
||||
for _, ex := range excludes {
|
||||
excludeMap[ex] = true
|
||||
}
|
||||
|
||||
for i := 0; i < val.NumField(); i++ {
|
||||
fieldName := typ.Field(i).Name
|
||||
if excludeMap[fieldName] {
|
||||
continue
|
||||
}
|
||||
if val.Field(i).IsZero() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// AtLeastOne ensures that AT LEAST ONE non-excluded exported field is non-zero.
|
||||
func AtLeastOne(v any, excludes ...string) bool {
|
||||
val := reflect.ValueOf(v)
|
||||
if val.Kind() == reflect.Pointer {
|
||||
val = val.Elem()
|
||||
}
|
||||
typ := val.Type()
|
||||
|
||||
excludeMap := make(map[string]bool)
|
||||
for _, ex := range excludes {
|
||||
excludeMap[ex] = true
|
||||
}
|
||||
|
||||
for i := 0; i < val.NumField(); i++ {
|
||||
fieldName := typ.Field(i).Name
|
||||
if excludeMap[fieldName] {
|
||||
continue
|
||||
}
|
||||
if !val.Field(i).IsZero() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user