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 }