93 lines
2.3 KiB
Go
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
|
|
}
|