validation

package
v1.0.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 31, 2025 License: MIT Imports: 9 Imported by: 0

README

Sysconf 验证器系统使用指南

Go Version MIT License

Sysconf 验证器系统 是一个企业级的配置验证框架,提供30+种内置验证规则、预定义验证器和灵活的自定义验证机制,确保配置数据的正确性和安全性。

🎯 核心特性

✨ 验证器类型
  • 🔧 预定义验证器: 针对常见场景的即用型验证器
  • 📝 规则验证器: 基于规则引擎的灵活验证
  • 🔗 复合验证器: 组合多个验证器的强大验证
  • ⚡ 函数式验证器: 支持自定义验证逻辑
🛡️ 验证规则
  • 📊 数据类型: string, number, boolean, array, object
  • 🌐 网络相关: email, url, ipv4, ipv6, hostname, port
  • 📐 数值范围: range, min, max, length
  • 🔒 格式验证: uuid, json, base64, regex, alphanum
  • 📅 时间相关: datetime, timezone
  • 💳 业务规则: creditcard, phonenumber
  • 🎚️ 枚举验证: enum, oneof
🚀 高级功能
  • 动态验证器管理: 运行时添加/移除验证器
  • 嵌套配置验证: 支持深层次配置结构验证
  • 错误聚合: 收集并报告所有验证错误
  • 性能优化: 高效的验证执行引擎

📦 快速开始

基础使用
package main

import (
    "log"
    "github.com/darkit/sysconf"
    "github.com/darkit/sysconf/validation"
)

func main() {
    // 创建配置实例,集成验证器
    cfg, err := sysconf.New(
        sysconf.WithPath("configs"),
        sysconf.WithName("app"),
        sysconf.WithMode("yaml"),
        // 🆕 添加预定义验证器
        sysconf.WithValidators(
            validation.NewDatabaseValidator(),  // 数据库配置验证
            validation.NewWebServerValidator(), // Web服务器配置验证
            validation.NewRedisValidator(),     // Redis配置验证
        ),
    )
    if err != nil {
        log.Fatal("创建配置失败:", err)
    }

    // 配置值会自动进行验证
    cfg.Set("server.port", 8080)     // ✅ 有效端口
    cfg.Set("server.port", 70000)    // ❌ 被验证器拦截
    cfg.Set("database.host", "localhost") // ✅ 有效主机名
}

🔧 预定义验证器

1. 数据库验证器 (DatabaseValidator)

验证数据库连接相关的配置项:

validator := validation.NewDatabaseValidator()

// 验证的配置项:
// - database.host      : 主机名验证
// - database.port      : 端口范围验证 (1-65535)
// - database.username  : 必填用户名
// - database.password  : 必填密码
// - database.type      : 数据库类型 (mysql,postgresql,sqlite,mongodb)
// - database.database  : 数据库名称
// - database.max_conns : 连接数范围 (1-100)
// - database.timeout   : 超时设置验证

示例配置:

database:
  host: "localhost"          # hostname验证
  port: 5432                 # port验证 (1-65535)
  username: "postgres"       # required验证
  password: "secret123"      # required验证
  database: "myapp"          # required验证
  type: "postgresql"         # enum验证
  max_conns: 10             # range验证 (1-100)
  timeout: "30s"            # 超时格式验证
2. Web服务器验证器 (WebServerValidator)

验证Web服务器相关配置:

validator := validation.NewWebServerValidator()

// 验证的配置项:
// - server.host    : 主机名验证
// - server.port    : 端口范围验证
// - server.mode    : 运行模式 (development,production,testing)
// - server.timeout : 超时设置验证
// - server.ssl.*   : SSL配置验证

示例配置:

server:
  host: "0.0.0.0"           # hostname验证
  port: 8080                # port验证
  mode: "production"        # enum验证
  timeout: "30s"            # 超时验证
  ssl:
    enabled: true           # boolean验证
    cert_file: "/path/to/cert.pem"  # required验证
    key_file: "/path/to/key.pem"    # required验证
3. Redis验证器 (RedisValidator)

验证Redis缓存配置:

validator := validation.NewRedisValidator()

// 验证的配置项:
// - redis.host      : 主机名验证
// - redis.port      : 端口验证
// - redis.db        : 数据库索引 (0-15)
// - redis.password  : 密码验证(可选)
// - redis.addresses : 地址列表验证
// - redis.timeout   : 超时验证
4. 日志验证器 (LogValidator)

验证日志配置:

validator := validation.NewLogValidator()

// 验证的配置项:
// - logging.level  : 日志级别 (debug,info,warn,error,fatal)
// - logging.format : 日志格式 (json,text)
// - logging.path   : 日志路径验证
5. 邮件验证器 (EmailValidator)

验证邮件发送配置:

validator := validation.NewEmailValidator()

// 验证的配置项:
// - email.smtp.host     : SMTP主机名验证
// - email.smtp.port     : SMTP端口验证
// - email.smtp.username : 邮箱格式验证
// - email.smtp.password : 必填密码验证
// - email.from          : 发件人邮箱验证
6. API验证器 (APIValidator)

验证API接口配置:

validator := validation.NewAPIValidator()

// 验证的配置项:
// - api.base_url                    : URL格式验证
// - api.timeout                     : 超时范围 (1-300秒)
// - api.rate_limit.enabled          : 布尔值验证
// - api.rate_limit.requests_per_minute : 范围验证 (1-10000)
// - api.auth.api_key                : 必填API密钥
// - api.auth.jwt.*                  : JWT配置验证

📝 规则验证器

创建自定义规则验证器
// 创建业务逻辑验证器
businessValidator := validation.NewRuleValidator("业务配置验证器")

// 添加结构化规则
businessValidator.AddRule("company.name", validation.Required("公司名称不能为空"))
businessValidator.AddRule("company.tax_id", validation.Pattern(`^\d{18}$`, "税务登记号必须是18位数字"))

// 添加字符串规则
businessValidator.AddStringRule("company.industry", "enum:technology,finance,healthcare,education")
businessValidator.AddStringRule("company.employee_count", "range:1,10000")
businessValidator.AddStringRule("company.email", "email")
businessValidator.AddStringRule("company.website", "url")

// 应用验证器
cfg.AddValidator(businessValidator)
支持的字符串规则
基础验证
"required"              // 必填字段
"string"                // 字符串类型
"number"                // 数字类型
网络相关
"email"                 // 邮箱格式
"url"                   // URL格式
"ipv4"                  // IPv4地址
"ipv6"                  // IPv6地址
"hostname"              // 主机名
"port"                  // 端口号 (1-65535)
数值范围
"range:1,100"           // 数值范围
"length:5,20"           // 字符串长度范围
格式验证
"regex:^[A-Z][a-z]+$"   // 正则表达式
"enum:apple,banana,orange" // 枚举值
"alphanum"              // 字母数字
"uuid"                  // UUID格式
"json"                  // JSON格式
"base64"                // Base64编码
时间相关
"datetime"              // 日期时间格式
"timezone"              // 时区验证
业务规则
"creditcard"            // 信用卡号
"phonenumber"           // 电话号码
结构化规则API
validator := validation.NewRuleValidator("结构化规则示例")

// 基础规则
validator.AddRule("user.name", validation.Required("用户名不能为空"))
validator.AddRule("user.age", validation.Range("18", "65", "年龄必须在18-65岁之间"))
validator.AddRule("user.email", validation.Pattern(`^[^@]+@[^@]+\.[^@]+$`, "邮箱格式不正确"))

// 枚举规则
validator.AddRule("user.role", validation.Enum("admin,user,guest", "角色必须是admin、user或guest之一"))

// 长度规则
validator.AddRule("user.password", validation.Length("8", "密码长度必须是8位"))

🔗 复合验证器

创建复合验证器
// 创建企业级应用验证器
enterpriseValidator := validation.NewCompositeValidator("企业级应用验证器",
    validation.NewDatabaseValidator(),  // 数据库验证
    validation.NewWebServerValidator(), // Web服务器验证
    validation.NewRedisValidator(),     // Redis验证
    validation.NewEmailValidator(),     // 邮件验证
    validation.NewAPIValidator(),       // API验证
)

// 添加到配置
cfg.AddValidator(enterpriseValidator)

// 获取子验证器信息
subValidators := enterpriseValidator.GetValidators()
fmt.Printf("包含 %d 个子验证器\n", len(subValidators))
预定义复合验证器
// 通用验证器(包含常用验证器)
commonValidator := validation.NewCommonValidator()

// 最小化验证器(仅包含基础验证器)
minimalValidator := validation.NewMinimalValidator()

⚡ 函数式验证器

创建函数式验证器
// 自定义业务逻辑验证
cfg.AddValidateFunc(func(config map[string]any) error {
    // 检查数据库连接配置的一致性
    if dbConfig, exists := config["database"].(map[string]any); exists {
        if dbType, ok := dbConfig["type"].(string); ok && dbType == "mysql" {
            if port, ok := dbConfig["port"].(int); ok && port != 3306 {
                return fmt.Errorf("MySQL数据库应使用默认端口3306")
            }
        }
    }
    return nil
})

// 环境特定验证
cfg.AddValidateFunc(func(config map[string]any) error {
    if appConfig, exists := config["app"].(map[string]any); exists {
        if env, ok := appConfig["env"].(string); ok && env == "production" {
            // 生产环境必须启用SSL
            if serverConfig, exists := config["server"].(map[string]any); exists {
                if sslConfig, exists := serverConfig["ssl"].(map[string]any); exists {
                    if enabled, ok := sslConfig["enabled"].(bool); !ok || !enabled {
                        return fmt.Errorf("生产环境必须启用SSL")
                    }
                }
            }
        }
    }
    return nil
})

🎛️ 动态验证器管理

运行时管理验证器
// 获取当前验证器列表
validators := cfg.GetValidators()
fmt.Printf("当前验证器数量: %d\n", len(validators))

// 动态添加验证器
tempValidator := validation.NewRuleValidator("临时验证器")
tempValidator.AddStringRule("temp.value", "required")
cfg.AddValidator(tempValidator)

// 清除所有验证器
cfg.ClearValidators()

// 重新添加必要的验证器
cfg.AddValidator(validation.NewDatabaseValidator())
cfg.AddValidator(validation.NewWebServerValidator())
条件验证器
// 根据环境动态添加验证器
env := cfg.GetString("app.env", "development")
switch env {
case "production":
    cfg.AddValidator(validation.NewEmailValidator())  // 生产环境需要邮件配置
    cfg.AddValidator(validation.NewAPIValidator())    // 生产环境需要API配置
case "development":
    cfg.AddValidator(validation.NewMinimalValidator()) // 开发环境使用最小验证
}

🔧 高级用法

1. 嵌套配置验证
// 验证深层嵌套的配置
validator := validation.NewRuleValidator("嵌套配置验证器")

// 支持点号分隔的深层路径
validator.AddStringRule("app.security.jwt.secret", "required")
validator.AddStringRule("app.security.jwt.expires_in", "required")
validator.AddStringRule("app.database.connections.read.host", "hostname")
validator.AddStringRule("app.database.connections.write.host", "hostname")

cfg.AddValidator(validator)
2. 条件验证
// 基于配置值的条件验证
cfg.AddValidateFunc(func(config map[string]any) error {
    // 如果启用了缓存,必须配置Redis
    if cacheEnabled := getNestedValue(config, "app.cache.enabled"); cacheEnabled == true {
        if redisHost := getNestedValue(config, "redis.host"); redisHost == nil || redisHost == "" {
            return fmt.Errorf("启用缓存时必须配置Redis主机地址")
        }
    }
    return nil
})
3. 批量验证
// 批量设置配置并验证
updates := map[string]interface{}{
    "server.host": "api.example.com",
    "server.port": 443,
    "database.host": "db.example.com",
    "database.port": 5432,
    "redis.host": "cache.example.com",
}

// 所有更新都会经过验证器验证
for key, value := range updates {
    if err := cfg.Set(key, value); err != nil {
        log.Printf("设置 %s 失败: %v", key, err)
    }
}
4. 自定义验证规则
// 注册自定义验证规则
validation.RegisterValidator("chinese_phone", func(value any, params string) (bool, string) {
    phone, ok := value.(string)
    if !ok {
        return false, "手机号必须是字符串类型"
    }
    
    // 中国手机号验证
    matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, phone)
    if !matched {
        return false, "无效的中国手机号格式"
    }
    return true, ""
})

// 使用自定义规则
validator := validation.NewRuleValidator("中国本地化验证器")
validator.AddStringRule("user.phone", "chinese_phone")
cfg.AddValidator(validator)

🧪 测试支持

验证器单元测试
func TestValidators(t *testing.T) {
    // 创建测试配置
    cfg, err := sysconf.New(
        sysconf.WithContent(`
database:
  host: "localhost"
  port: 5432
  username: "test"
  password: "test123"
  type: "postgresql"
`),
        sysconf.WithValidators(
            validation.NewDatabaseValidator(),
        ),
    )
    require.NoError(t, err)

    // 测试有效配置
    err = cfg.Set("database.port", 3306)
    assert.NoError(t, err)

    // 测试无效配置
    err = cfg.Set("database.port", 70000)
    assert.Error(t, err)
    assert.Contains(t, err.Error(), "port")

    // 测试配置解析
    var config struct {
        Database struct {
            Host string `config:"host"`
            Port int    `config:"port"`
        } `config:"database"`
    }
    
    err = cfg.Unmarshal(&config)
    assert.NoError(t, err)
    assert.Equal(t, "localhost", config.Database.Host)
}
验证器性能测试
func BenchmarkValidation(b *testing.B) {
    validator := validation.NewDatabaseValidator()
    config := map[string]any{
        "database": map[string]any{
            "host":     "localhost",
            "port":     5432,
            "username": "test",
            "password": "test123",
            "type":     "postgresql",
        },
    }

    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        err := validator.Validate(config)
        if err != nil {
            b.Fatalf("验证失败: %v", err)
        }
    }
}

🚨 错误处理

验证错误类型
// 尝试设置无效配置
if err := cfg.Set("server.port", 70000); err != nil {
    // 验证错误包含详细信息
    fmt.Printf("验证失败: %v\n", err)
    // 输出: validator 'Web Server Configuration Validator' - field 'server.port': port number must be between 1-65535
}

// 结构体验证错误
var config AppConfig
if err := cfg.Unmarshal(&config); err != nil {
    fmt.Printf("配置解析失败: %v\n", err)
}
错误聚合

验证器会聚合多个验证错误,提供完整的错误信息:

// 同时设置多个无效值
cfg.Set("server.port", 70000)      // 端口错误
cfg.Set("database.host", "")       // 主机名错误
cfg.Set("redis.db", 20)           // Redis DB索引错误

// 获取所有验证错误
errors := cfg.GetValidationErrors() // 自定义方法,返回所有错误
for _, err := range errors {
    fmt.Printf("验证错误: %v\n", err)
}

🎯 最佳实践

1. 验证器组织
// ✅ 推荐:按模块组织验证器
func setupValidators(cfg *sysconf.Config, env string) {
    // 基础验证器(所有环境)
    cfg.AddValidator(validation.NewDatabaseValidator())
    cfg.AddValidator(validation.NewWebServerValidator())
    
    // 环境特定验证器
    switch env {
    case "production":
        cfg.AddValidator(validation.NewEmailValidator())
        cfg.AddValidator(validation.NewAPIValidator())
    case "development":
        cfg.AddValidator(validation.NewLogValidator())
    }
    
    // 业务逻辑验证器
    cfg.AddValidator(createBusinessValidator())
}
2. 错误处理策略
// ✅ 推荐:优雅的错误处理
func loadConfig() (*AppConfig, error) {
    cfg, err := sysconf.New(/* 选项 */)
    if err != nil {
        return nil, fmt.Errorf("创建配置失败: %w", err)
    }
    
    var config AppConfig
    if err := cfg.Unmarshal(&config); err != nil {
        // 配置验证失败,使用默认配置
        log.Printf("配置验证失败,使用默认配置: %v", err)
        return getDefaultConfig(), nil
    }
    
    return &config, nil
}
3. 性能优化
// ✅ 推荐:验证器复用
var (
    commonValidators = []validation.Validator{
        validation.NewDatabaseValidator(),
        validation.NewWebServerValidator(),
        validation.NewRedisValidator(),
    }
)

func createConfig() *sysconf.Config {
    cfg, _ := sysconf.New(
        sysconf.WithValidators(commonValidators...),
    )
    return cfg
}
4. 配置分层验证
// ✅ 推荐:分层验证策略
func createLayeredValidation() *validation.CompositeValidator {
    return validation.NewCompositeValidator("分层验证器",
        // 第一层:基础格式验证
        validation.NewRuleValidator("格式验证器").
            AddStringRule("*.port", "port").
            AddStringRule("*.host", "hostname").
            AddStringRule("*.email", "email"),
        
        // 第二层:业务逻辑验证
        createBusinessValidator(),
        
        // 第三层:环境特定验证
        createEnvironmentValidator(),
    )
}

📚 API 参考

验证器接口
type Validator interface {
    Validate(config map[string]any) error
    GetName() string
}
主要类型
// 规则验证器
type StructuredValidator struct {
    // 添加规则
    AddRule(key string, rule ValidationRule) *StructuredValidator
    AddStringRule(key string, rule string) *StructuredValidator
    AddRules(key string, rules ...ValidationRule) *StructuredValidator
    AddStringRules(key string, rules ...string) *StructuredValidator
}

// 复合验证器
type CompositeValidator struct {
    // 添加验证器
    AddValidator(validator Validator) *CompositeValidator
    GetValidators() []Validator
}

// 函数式验证器
type ValidatorFunc func(config map[string]any) error
配置方法
// 验证器管理
cfg.AddValidator(validator Validator)
cfg.AddValidateFunc(func(config map[string]any) error)
cfg.GetValidators() []Validator
cfg.ClearValidators()

// 验证相关配置选项
sysconf.WithValidators(validators ...Validator)

🔗 相关资源


验证器系统让您的配置更安全、更可靠

🏠 返回主文档🐛 问题反馈💡 功能建议

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func RegisterValidator

func RegisterValidator(name string, validator RuleValidator)

RegisterValidator 注册自定义验证规则

func Validate

func Validate(value interface{}, rule ValidationRule) error

Validate 验证值

func ValidateStruct

func ValidateStruct(v interface{}, rules map[string][]ValidationRule) error

ValidateStruct 验证结构体

func ValidateValue

func ValidateValue(value any, rule string) (bool, string)

ValidateValue 验证值是否符合规则

Types

type CompositeValidator

type CompositeValidator struct {
	// contains filtered or unexported fields
}

CompositeValidator 复合验证器,组合多个验证器

func NewCommonValidator

func NewCommonValidator() *CompositeValidator

NewCommonValidator 创建通用预定义验证器

func NewCompositeValidator

func NewCompositeValidator(name string, validators ...Validator) *CompositeValidator

NewCompositeValidator 创建复合验证器

func NewMinimalValidator

func NewMinimalValidator() *CompositeValidator

NewMinimalValidator 创建最小化验证器

func (*CompositeValidator) AddValidator

func (c *CompositeValidator) AddValidator(validator Validator) *CompositeValidator

AddValidator 添加验证器

func (*CompositeValidator) GetName

func (c *CompositeValidator) GetName() string

GetName 获取验证器名称

func (*CompositeValidator) GetValidators

func (c *CompositeValidator) GetValidators() []Validator

GetValidators 获取所有子验证器

func (*CompositeValidator) Validate

func (c *CompositeValidator) Validate(config map[string]any) error

Validate 执行所有子验证器的验证

type DefaultValidator

type DefaultValidator struct {
	// contains filtered or unexported fields
}

DefaultValidator 默认验证器,包含基础的配置验证规则

func NewDefaultValidator

func NewDefaultValidator() *DefaultValidator

NewDefaultValidator 创建默认验证器

func (*DefaultValidator) GetName

func (d *DefaultValidator) GetName() string

GetName 获取验证器名称

func (*DefaultValidator) Validate

func (d *DefaultValidator) Validate(config map[string]any) error

Validate 执行默认验证规则

type RuleValidator

type RuleValidator func(value any, params string) (bool, string)

RuleValidator 验证规则函数类型

type StructuredValidator

type StructuredValidator struct {
	// contains filtered or unexported fields
}

StructuredValidator 基于规则的验证器(重命名避免冲突)

func NewAPIValidator

func NewAPIValidator() *StructuredValidator

NewAPIValidator 创建API配置验证器

func NewDatabaseValidator

func NewDatabaseValidator() *StructuredValidator

NewDatabaseValidator 创建数据库配置验证器

func NewEmailValidator

func NewEmailValidator() *StructuredValidator

NewEmailValidator 创建邮件配置验证器

func NewLogValidator

func NewLogValidator() *StructuredValidator

NewLogValidator 创建日志配置验证器

func NewRedisValidator

func NewRedisValidator() *StructuredValidator

NewRedisValidator 创建Redis配置验证器

func NewRuleValidator

func NewRuleValidator(name string) *StructuredValidator

NewRuleValidator 创建基于规则的验证器(保持接口兼容性)

func NewWebServerValidator

func NewWebServerValidator() *StructuredValidator

NewWebServerValidator 创建Web服务器配置验证器

func (*StructuredValidator) AddRule

AddRule 添加单个结构化规则

func (*StructuredValidator) AddRules

func (r *StructuredValidator) AddRules(key string, rules ...ValidationRule) *StructuredValidator

AddRules 添加多个结构化规则

func (*StructuredValidator) AddStringRule

func (r *StructuredValidator) AddStringRule(key string, rule string) *StructuredValidator

AddStringRule 添加单个字符串规则

func (*StructuredValidator) AddStringRules

func (r *StructuredValidator) AddStringRules(key string, rules ...string) *StructuredValidator

AddStringRules 添加多个字符串规则

func (*StructuredValidator) GetName

func (r *StructuredValidator) GetName() string

GetName 获取验证器名称

func (*StructuredValidator) GetRulesForField

func (r *StructuredValidator) GetRulesForField(key string) []ValidationRule

GetRulesForField 获取特定字段的结构化规则

func (*StructuredValidator) GetStringRulesForField

func (r *StructuredValidator) GetStringRulesForField(key string) []string

GetStringRulesForField 获取特定字段的字符串规则

func (*StructuredValidator) GetSupportedFields

func (r *StructuredValidator) GetSupportedFields() []string

GetSupportedFields 获取验证器支持的所有字段前缀

func (*StructuredValidator) HasRuleForField

func (r *StructuredValidator) HasRuleForField(key string) bool

HasRuleForField 检查是否有特定字段的规则

func (*StructuredValidator) Validate

func (r *StructuredValidator) Validate(config map[string]any) error

Validate 执行规则验证

type ValidationRule

type ValidationRule struct {
	// Type 验证类型
	Type string

	// Value 验证值
	Value string

	// Message 错误消息
	Message string
}

ValidationRule 验证规则

func Enum

func Enum(values string, message string) ValidationRule

Enum 创建枚举验证规则

func Length

func Length(length string, message string) ValidationRule

Length 创建长度验证规则

func Max

func Max(max string, message string) ValidationRule

Max 创建最大值验证规则

func Min

func Min(min string, message string) ValidationRule

Min 创建最小值验证规则

func NewRule

func NewRule(typ string, value string, message string) ValidationRule

NewRule 创建验证规则

func Pattern

func Pattern(pattern string, message string) ValidationRule

Pattern 创建正则表达式验证规则

func Range

func Range(min, max string, message string) ValidationRule

Range 创建范围验证规则

func Required

func Required(message string) ValidationRule

Required 创建必填验证规则

type Validator

type Validator interface {
	// Validate 验证配置数据
	Validate(config map[string]any) error
	// GetName 获取验证器名称
	GetName() string
}

Validator 统一的验证器接口

type ValidatorFunc

type ValidatorFunc func(config map[string]any) error

ValidatorFunc 函数式验证器

func (ValidatorFunc) GetName

func (f ValidatorFunc) GetName() string

GetName 实现 Validator 接口

func (ValidatorFunc) Validate

func (f ValidatorFunc) Validate(config map[string]any) error

Validate 实现 Validator 接口

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL