qubit-common 0.5.2

Foundational utilities and language-level tools for Rust application development
Documentation
# 参数验证模块 (Argument)

作者: 胡海星

## 概述

本模块提供参数验证功能,采用符合 Rust 习惯的设计。通过 trait 扩展模式,为各种类型提供验证方法,支持链式调用。

## 模块结构

```
argument/
├── error.rs         ## 错误类型定义
├── numeric.rs       ## 数值参数验证
├── string.rs        ## 字符串参数验证
├── collection.rs    ## 集合参数验证
├── option.rs        ## Option 参数验证
├── condition.rs     ## 条件和状态验证
└── mod.rs          ## 模块入口
```

## 核心特性

### 1. 数值验证 (`NumericArgument`)

支持所有实现 `PartialOrd + Default + Display + Copy` 的类型。

```rust
use common_rs::lang::argument::NumericArgument;

// 验证非负
let count = 10;
let count = count.require_non_negative("count")?;

// 验证范围
let volume = 50;
let volume = volume.require_in_closed_range("volume", 0, 100)?;

// 链式调用
let age = 25;
let age = age
    .require_non_negative("age")
    .and_then(|a| a.require_in_closed_range("age", 0, 150))?;
```

**可用方法:**
- `require_zero()` - 验证为零
- `require_non_zero()` - 验证非零
- `require_positive()` - 验证为正
- `require_non_negative()` - 验证非负
- `require_negative()` - 验证为负
- `require_non_positive()` - 验证非正
- `require_in_closed_range()` - 闭区间 [min, max]
- `require_in_open_range()` - 开区间 (min, max)
- `require_in_left_open_range()` - 左开右闭 (min, max]
- `require_in_right_open_range()` - 左闭右开 [min, max)
- `require_less()` - 小于
- `require_less_equal()` - 小于等于
- `require_greater()` - 大于
- `require_greater_equal()` - 大于等于

### 2. 字符串验证 (`StringArgument`)

支持 `&str` 和 `String` 类型。

```rust
use common_rs::lang::argument::StringArgument;

// 验证非空白
let username = "alice";
let username = username.require_non_blank("username")?;

// 验证长度
let password = "secret123";
let password = password
    .require_length_at_least("password", 8)
    .and_then(|p| p.require_length_at_most("password", 20))?;

// 正则匹配
use regex::Regex;
let email = "user@example.com";
let pattern = Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")?;
let email = email.require_match("email", &pattern)?;
```

**可用方法:**
- `require_non_blank()` - 验证非空白
- `require_length_be()` - 长度等于
- `require_length_at_least()` - 最小长度
- `require_length_at_most()` - 最大长度
- `require_length_in_range()` - 长度范围
- `require_match()` - 正则匹配
- `require_not_match()` - 正则不匹配

### 3. 集合验证 (`CollectionArgument`)

支持 `&[T]` 和 `Vec<T>` 类型。

```rust
use common_rs::lang::argument::CollectionArgument;

// 验证非空
let items = vec![1, 2, 3];
let items = items.require_non_empty("items")?;

// 验证长度
let tags = vec!["rust", "programming"];
let tags = tags
    .require_non_empty("tags")
    .and_then(|t| t.require_length_at_most("tags", 10))?;
```

**可用方法:**
- `require_non_empty()` - 验证非空
- `require_length_be()` - 长度等于
- `require_length_at_least()` - 最小长度
- `require_length_at_most()` - 最大长度
- `require_length_in_range()` - 长度范围

### 4. Option 验证 (`OptionArgument`)

支持 `Option<T>` 类型。

```rust
use common_rs::lang::argument::OptionArgument;

// 验证非空
let timeout: Option<u64> = Some(30);
let timeout = timeout.require_non_null("timeout")?;

// 验证非空且满足条件
let port: Option<u16> = Some(8080);
let port = port.require_non_null_and(
    "port",
    |&p| p >= 1024,
    "必须大于等于 1024"
)?;

// 可选验证
let max_conn: Option<usize> = Some(100);
let max_conn = max_conn.validate_if_present("max_connections", |c| {
    if *c > 10000 {
        Err("连接数过大".into())
    } else {
        Ok(*c)
    }
})?;
```

**可用方法:**
- `require_non_null()` - 验证非 None
- `require_non_null_and()` - 验证非 None 且满足条件
- `validate_if_present()` - 如果存在则验证

### 5. 条件验证

通用的条件和状态验证函数。

```rust
use common_rs::lang::argument::{check_argument, check_state, check_bounds};

// 基本条件检查
let is_valid = true;
check_argument(is_valid)?;

// 带消息的检查
check_argument_with_message(count > 0, "计数必须为正")?;

// 状态检查
check_state(is_initialized)?;

// 边界检查
check_bounds(offset, length, total_length)?;

// 索引检查
let index = check_element_index(5, list_size)?;
```

**可用函数:**
- `check_argument()` - 检查参数条件
- `check_argument_with_message()` - 带消息的参数检查
- `check_argument_fmt()` - 格式化消息的参数检查
- `check_state()` - 检查状态条件
- `check_state_with_message()` - 带消息的状态检查
- `check_bounds()` - 边界检查
- `check_element_index()` - 元素索引检查
- `check_position_index()` - 位置索引检查
- `check_position_indexes()` - 位置索引范围检查

## 错误处理

所有验证方法返回 `ArgumentResult<T>`,这是 `Result<T, ArgumentError>` 的类型别名。

```rust
use common_rs::lang::argument::{ArgumentError, ArgumentResult};

fn validate_config(port: u16, timeout: u64) -> ArgumentResult<()> {
    port.require_in_closed_range("port", 1024, 65535)?;
    timeout.require_positive("timeout")?;
    Ok(())
}

// 错误处理
match validate_config(80, 30) {
    Ok(_) => println!("配置有效"),
    Err(e) => eprintln!("配置错误: {}", e.message()),
}
```

## 设计理念

1. **类型安全**:利用 Rust 类型系统在编译期保证安全
2. **零成本抽象**:编译后与手动检查性能相同
3. **链式调用**:返回 `Result<Self>` 支持优雅的链式验证
4. **清晰错误**:提供友好的错误消息,包含参数名和值
5. **符合习惯**:遵循 Rust 的设计哲学和最佳实践

## 示例程序

运行示例程序查看完整用法:

```bash
cargo run --example argument_demo
```

## 测试

```bash
cargo test --lib lang::argument
```

## 文档

运行 `cargo doc --open` 查看完整 API 文档。