diff --git a/data_type.go b/data_type.go index ec737e0..6a89c01 100644 --- a/data_type.go +++ b/data_type.go @@ -194,3 +194,21 @@ func getDataTypeDesc(value DataType, description string) DataTypeDesc { Description: description, } } + +var ( + // DataTypeBaseNumber 基础的int类型 + DataTypeBaseNumber = []DataType{DataTypeInt, DataTypeUint, DataTypeFloat, DataTypeIntPtr, DataTypeUintPtr, DataTypeFloatPtr} + DataTypeBaseInt = []DataType{DataTypeInt, DataTypeIntPtr} + DataTypeBaseUint = []DataType{DataTypeUint, DataTypeUintPtr} + DataTypeBaseFloat = []DataType{DataTypeFloat, DataTypeFloatPtr} + DataTypeBaseString = []DataType{DataTypeString, DataTypeStringPtr} + DataTypeBaseBool = []DataType{DataTypeBool, DataTypeBoolPtr} +) + +func getMergeDataTypeList(dataTypeList ...[]DataType) []DataType { + res := []DataType{} + for _, dataTypeItemList := range dataTypeList { + res = append(res, dataTypeItemList...) + } + return res +} diff --git a/validator.go b/validator.go new file mode 100644 index 0000000..1e4182d --- /dev/null +++ b/validator.go @@ -0,0 +1,208 @@ +// Package consts ... +// +// Description : consts ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-01-22 16:08 +// @see: https://github.com/go-playground/validator/blob/master/README.md#strings +// @demo: https://www.cnblogs.com/zj420255586/p/13542395.html +package consts + +type ValidatorRule string // 验证规则 + +func (vr *ValidatorRule) String() string { + return string(*vr) +} + +func (vr *ValidatorRule) MarshalJSON() ([]byte, error) { + return []byte(vr.String()), nil +} + +// Config 验证规则的配置 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:10 2025/1/22 +func (vr *ValidatorRule) Config() ValidatorRuleConfig { + return ValidatorRuleSupportDataTypeTable[*vr] +} + +// IsSupportDataType 是否支持指定的数据类型 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:11 2025/1/22 +func (vr *ValidatorRule) IsSupportDataType(dataType DataType) bool { + dataTypeList := vr.Config().SupportDataTypeList + if len(dataTypeList) == 0 { + // 未配置则认为支持 + return true + } + for _, dataTypeItem := range dataTypeList { + if dataType.String() == dataTypeItem.String() { + return true + } + } + return false +} + +type ValidatorRuleConfig struct { + ValidatorRule ValidatorRule `json:"validator_rule"` // 验证规则 + Description string `json:"description"` // 规则描述 + SupportDataTypeList []DataType `json:"support_data_type_list"` // 支持的数据类型列表 +} + +// ValidatorRuleSupportDataTypeTable 验证规则支持的数据类型表 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:13 2025/1/22 +var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ + ValidatorRuleEqcsfield: { + ValidatorRule: ValidatorRuleEqcsfield, + Description: "跨结构体字段相等", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleEqfield: { + ValidatorRule: ValidatorRuleEqfield, + Description: "同结构体字段相等", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleFieldcontains: { + ValidatorRule: ValidatorRuleFieldcontains, + Description: "检查指定的字段值是否存在于字段中", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFieldexcludes: { + ValidatorRule: ValidatorRuleFieldexcludes, + Description: "检查指定的字段值是否不存在于字段中", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleGtcsfield: { + ValidatorRule: ValidatorRuleGtcsfield, + Description: "大于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtecsfield: { + ValidatorRule: ValidatorRuleGtecsfield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtfield: { + ValidatorRule: ValidatorRuleGtfield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtefield: { + ValidatorRule: ValidatorRuleGtefield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtcsfield: { + ValidatorRule: ValidatorRuleLtcsfield, + Description: "小于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtecsfield: { + ValidatorRule: ValidatorRuleLtecsfield, + Description: "小于等于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtfield: { + ValidatorRule: ValidatorRuleLtfield, + Description: "小于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtefield: { + ValidatorRule: ValidatorRuleLtefield, + Description: "小于等于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleNecsfield: { + ValidatorRule: ValidatorRuleNecsfield, + Description: "不等于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleNefield: { + ValidatorRule: ValidatorRuleNefield, + Description: "不等于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleEq: { + ValidatorRule: ValidateRuleEq, + Description: "等于(严格校验)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleEqIgnoreCase: { + ValidatorRule: ValidateRuleEqIgnoreCase, + Description: "等于(忽略大小写)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleGt: { + ValidatorRule: ValidateRuleGt, + Description: "大于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleGte: { + ValidatorRule: ValidateRuleGte, + Description: "大于等于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleLt: { + ValidatorRule: ValidateRuleLt, + Description: "小于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleLte: { + ValidatorRule: ValidateRuleLte, + Description: "小于等于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleNe: { + ValidatorRule: ValidateRuleNe, + Description: "不等于(严格判断)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleNeIgnoreCase: { + ValidatorRule: ValidateRuleNeIgnoreCase, + Description: "不等于(忽略大小写)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, +} + +const ( + // ValidatorRuleEqcsfield .....Fields .............. + ValidatorRuleEqcsfield ValidatorRule = "eqcsfield" // 跨结构体字段相等 + ValidatorRuleEqfield ValidatorRule = "eqfield" // 同结构体字段相等 + ValidatorRuleFieldcontains ValidatorRule = "fieldcontains" // 检查指定的字段值是否存在于字段中 + ValidatorRuleFieldexcludes ValidatorRule = "fieldexcludes" // 检查指定的字段值是否存在于字段中 + ValidatorRuleGtcsfield ValidatorRule = "gtcsfield" // 大于(跨结构体) + ValidatorRuleGtecsfield ValidatorRule = "gtecsfield" // 大于等于(跨结构体) + ValidatorRuleGtfield ValidatorRule = "gtfield" // 大于(同结构体) + ValidatorRuleGtefield ValidatorRule = "gtefield" // 大于等于(同结构体) + ValidatorRuleLtcsfield ValidatorRule = "ltcsfield" // 小于(跨结构体) + ValidatorRuleLtecsfield ValidatorRule = "ltecsfield" // 小于等于(跨结构体) + ValidatorRuleLtfield ValidatorRule = "ltfield" // 小于(同结构体) + ValidatorRuleLtefield ValidatorRule = "ltefield" // 小于等于(同结构体) + ValidatorRuleNecsfield ValidatorRule = "necsfield" // 不等于(跨结构体) + ValidatorRuleNefield ValidatorRule = "nefield" // 不等于(同结构体) + + // ValidateRuleEq Comparisons .................... + ValidateRuleEq ValidatorRule = "eq" // 相等(严格判断) + ValidateRuleEqIgnoreCase ValidatorRule = "eq_ignore_case" // 相等(忽略大小写) + ValidateRuleGt ValidatorRule = "gt" // 大于 + ValidateRuleGte ValidatorRule = "gte" // 大于等于 + ValidateRuleLt ValidatorRule = "lt" // 小于 + ValidateRuleLte ValidatorRule = "lte" // 小于等于 + ValidateRuleNe ValidatorRule = "ne" // 不相等(严格判断) + ValidateRuleNeIgnoreCase ValidatorRule = "ne_ignore_case" // 不相等(忽略大小写) + + // ValidatorCommonDir ............others + ValidatorCommonDir ValidatorRule = "dir" // 文件夹存在 + ValidatorCommonDirPath ValidatorRule = "dirpath" // 文件夹路径 + ValidatorCommonFile ValidatorRule = "file" // 文件存在 + ValidatorCommonFilepath ValidatorRule = "filepath" // 文件路径 + ValidatorCommonImage ValidatorRule = "image" // 图像 + ValidatorCommonIsDefault ValidatorRule = "isdefault" // 是否默认值 +)