| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package valid
-
- import (
- "encoding/json"
- "fmt"
- "strconv"
- "strings"
- )
-
- // ValidateAndConvert 验证并转换配置值(纯函数模式)
- func ValidateAndConvert(fieldType, yamlValue string) (string, error) {
- if fieldType == "" {
- // 如果没有指定类型,按字符串处理
- return yamlValue, nil
- }
-
- switch fieldType {
- case "bool":
- return ValidateBool(yamlValue)
- case "int":
- return ValidateInt(yamlValue)
- case "string":
- return ValidateString(yamlValue)
- case "uint64":
- return ValidateUint64(yamlValue)
- default:
- // 检查是否是 map 类型
- if strings.HasPrefix(fieldType, "map[") {
- return ValidateMap(fieldType, yamlValue)
- }
- // 未知类型,按原样返回(可能是自定义类型)
- return yamlValue, nil
- }
- }
-
- // validateBool 验证布尔值(纯函数模式)
- func ValidateBool(value string) (string, error) {
- if value == "" {
- return "false", nil // 空值默认为 false
- }
-
- // 支持多种布尔表示形式
- switch strings.ToLower(value) {
- case "true", "1", "yes", "y", "on":
- return "true", nil
- case "false", "0", "no", "n", "off":
- return "false", nil
- default:
- // 尝试解析
- if b, err := strconv.ParseBool(value); err == nil {
- return strconv.FormatBool(b), nil
- }
- return "", fmt.Errorf("无效的布尔值: %s,可接受值: true/false, 1/0, yes/no, on/off", value)
- }
- }
-
- // validateInt 验证整数值(纯函数模式)
- func ValidateInt(value string) (string, error) {
- if value == "" {
- return "0", nil // 空值默认为 0
- }
-
- // 尝试解析为整数
- _, err := strconv.Atoi(value)
- if err != nil {
- // 也尝试解析为浮点数然后取整
- if f, err := strconv.ParseFloat(value, 64); err == nil {
- return strconv.Itoa(int(f)), nil
- }
- return "", fmt.Errorf("无效的整数值: %s", value)
- }
-
- return value, nil
- }
-
- // validateUint64 验证无符号64位整数(纯函数模式)
- func ValidateUint64(value string) (string, error) {
- if value == "" {
- return "0", nil // 空值默认为 0
- }
-
- // 尝试解析为 uint64
- _, err := strconv.ParseUint(value, 10, 64)
- if err != nil {
- return "", fmt.Errorf("无效的uint64值: %s", value)
- }
-
- return value, nil
- }
-
- // validateString 验证字符串(纯函数模式)
- func ValidateString(value string) (string, error) {
- // 字符串类型不需要特殊验证
- return value, nil
- }
-
- // validateMap 验证 map 类型(纯函数模式)
- func ValidateMap(fieldType, value string) (string, error) {
- if value == "" {
- return "{}", nil // 空值返回空对象
- }
-
- // 检查是否是期望的 map[string]*subconfigs.DbConfig 类型
- if fieldType != "map[string]*subconfigs.DbConfig" {
- return "", fmt.Errorf("不支持的map类型: %s", fieldType)
- }
-
- // 验证是否为有效的 JSON
- if !IsValidJSON(value) {
- return "", fmt.Errorf("map类型需要有效的JSON格式")
- }
-
- return value, nil
- }
-
- // isValidJSON 检查是否为有效的 JSON(纯函数模式)
- func IsValidJSON(s string) bool {
- var js interface{}
- return json.Unmarshal([]byte(s), &js) == nil
- }
|