gorm/apaas/checker.go
2025-05-28 14:28:49 +08:00

93 lines
2.3 KiB
Go

package apaas
import (
"encoding/json"
"fmt"
)
type Checker interface {
Check(string) error
}
func ExtraCheck(rule map[string]*ExtraFieldMeta, extra string) error {
var data map[string]any
err := json.Unmarshal([]byte(extra), &data)
if err != nil {
return err
}
for k, v := range data {
r, ok := rule[k]
if !ok || r == nil {
continue
}
err = FieldCheck(r, v)
if err != nil {
return GenError(err.Error())
}
}
return nil
}
func FieldCheck(rule *ExtraFieldMeta, value any) error {
if rule == nil || value == nil {
return nil
}
var err error
switch val := value.(type) {
case map[string]any:
if len(rule.ObjectMeta) == 0 {
return nil
}
for k, v := range val {
r, ok := rule.ObjectMeta[k]
if !ok || r == nil {
continue
}
err = FieldCheck(r, v)
if err != nil {
return fmt.Errorf("rule(key=%s, type=%s), value(type=map[%s], suberror=%s)",
rule.Key, FieldMapString[rule.Type], k, err.Error())
}
}
case []any:
if rule.Type != FieldArray {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type=array, value=%#v)",
rule.Key, FieldMapString[rule.Type], val)
}
if len(rule.ArrayMeta) != 0 {
for i, v := range val {
err = FieldCheck(rule.ArrayMeta[i], v)
if err != nil {
return fmt.Errorf("rule(key=%s, type=%s), value(type array, [%d] element suberror=%s)",
rule.Key, FieldMapString[rule.Type], i, err.Error())
}
}
}
case string:
if rule.Type != FieldString {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type=string, value=%#v)",
rule.Key, FieldMapString[rule.Type], val)
}
case float64:
if rule.Type != FieldInt && rule.Type != FieldFloat64 {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type=float/int, value=%#v)",
rule.Key, FieldMapString[rule.Type], val)
}
if rule.Type == FieldInt && float64(int(val)) != val {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type=float, value=%#v)",
rule.Key, FieldMapString[rule.Type], val)
}
case bool:
if rule.Type != FieldBool {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type=bool, value=%#v)",
rule.Key, FieldMapString[rule.Type])
}
case nil:
if rule.Type != FieldArray || rule.Type != FieldObject {
return fmt.Errorf("rule(key=%s, type=%s) dismatch value(type nil)",
rule.Key, FieldMapString[rule.Type])
}
}
return nil
}