mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-12 18:11:34 +08:00
99 lines
2.3 KiB
Go
99 lines
2.3 KiB
Go
package model_runtime
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
ParameterTypeInt = "int"
|
|
ParameterTypeStr = "string"
|
|
ParameterTypeFloat = "float"
|
|
ParameterTypeBool = "bool"
|
|
)
|
|
|
|
type IParamValidator interface {
|
|
Valid(map[string]interface{}) error
|
|
GenConfig(target map[string]interface{}, origin map[string]interface{}) (string, error)
|
|
}
|
|
|
|
type ParamValidator []Param
|
|
|
|
func (p ParamValidator) GenConfig(target map[string]interface{}, origin map[string]interface{}) (string, error) {
|
|
for _, rule := range p {
|
|
if !rule.Secret {
|
|
continue
|
|
}
|
|
vv, ok := origin[rule.Name]
|
|
if !ok {
|
|
continue
|
|
}
|
|
v, ok := vv.(string)
|
|
if !ok || v == "******" {
|
|
continue
|
|
}
|
|
target[rule.Name] = origin[rule.Name]
|
|
}
|
|
data, err := json.Marshal(target)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(data), nil
|
|
}
|
|
|
|
type Param struct {
|
|
Name string `json:"name" yaml:"name"`
|
|
Default interface{} `json:"default" yaml:"default"`
|
|
Type string `json:"type" yaml:"type"`
|
|
Min float64 `json:"min" yaml:"min"`
|
|
Max float64 `json:"max" yaml:"max"`
|
|
Required bool `json:"required" yaml:"required"`
|
|
Secret bool `json:"secret" yaml:"secret"`
|
|
}
|
|
|
|
func (p ParamValidator) Valid(params map[string]interface{}) error {
|
|
for _, rule := range p {
|
|
v, ok := params[rule.Name]
|
|
if !ok {
|
|
if rule.Required {
|
|
return fmt.Errorf("missing required parameter %s", rule.Name)
|
|
}
|
|
continue
|
|
}
|
|
|
|
switch rule.Type {
|
|
case ParameterTypeInt:
|
|
r, ok := v.(int)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
if r < int(rule.Min) || r > int(rule.Max) {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
case ParameterTypeFloat:
|
|
r, ok := v.(float64)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
if r < rule.Min || r > rule.Max {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
case ParameterTypeStr:
|
|
vv, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
if rule.Required && len(vv) == 0 {
|
|
return fmt.Errorf("parameter %s is empty", rule.Name)
|
|
}
|
|
case ParameterTypeBool:
|
|
_, ok = v.(bool)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
|
|
}
|