clamber-core 0.1.3

library for clamber
Documentation
# 配置管理模块 (Config)


这个模块提供了统一的配置管理功能,支持多种配置文件格式和环境变量覆盖。

## 特性


- 🗂️ **多格式支持**: 支持 YAML、TOML、JSON 配置文件
- 🌍 **环境变量覆盖**: 支持通过环境变量覆盖配置值
- 🔄 **多文件合并**: 支持加载和合并多个配置文件
- 🎯 **自动发现**: 自动发现应用配置文件
- ⚙️ **默认值支持**: 支持设置配置默认值
- 🔧 **灵活构建**: 提供灵活的配置构建器模式
- 📁 **忽略缺失**: 可选择忽略缺失的配置文件
- 🛡️ **类型安全**: 基于 Serde 的强类型配置反序列化

## 基本使用


### 1. 定义配置结构


```rust
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]

struct AppConfig {
    name: String,
    port: u16,
    debug: bool,
    database: DatabaseConfig,
}

#[derive(Debug, Serialize, Deserialize)]

struct DatabaseConfig {
    host: String,
    port: u16,
    username: String,
    password: String,
}
```

### 2. 从单个配置文件加载


```rust
use clamber_core::load_config;

// 从 YAML 文件加载
let config: AppConfig = load_config(\"config.yaml\")?;

// 从 TOML 文件加载  
let config: AppConfig = load_config(\"config.toml\")?;

// 从 JSON 文件加载
let config: AppConfig = load_config(\"config.json\")?;
```

### 3. 支持环境变量覆盖


```rust
use clamber_core::load_config_with_env;

// 加载配置文件并支持 APP_ 前缀的环境变量覆盖
let config: AppConfig = load_config_with_env(\"config.yaml\", \"APP\")?;

// 环境变量示例:
// APP_PORT=8080
// APP_DEBUG=true  
// APP_DATABASE__HOST=localhost
// APP_DATABASE__PORT=5432
```

### 4. 使用配置构建器


```rust
use clamber_core::ConfigBuilder;

let config: AppConfig = ConfigBuilder::new()
    // 添加多个配置文件(按优先级顺序)
    .add_yaml_file(\"base.yaml\")
    .add_yaml_file(\"production.yaml\")
    // 设置默认值
    .with_default(\"name\", \"my-app\")?
    .with_default(\"port\", 8080)?
    // 启用环境变量覆盖
    .with_env_prefix(\"APP\")
    .with_env_separator(\"__\")
    // 忽略缺失的配置文件
    .ignore_missing_files(true)
    .build()?;
```

### 5. 自动发现配置


```rust
use clamber_core::auto_load_config;

// 自动查找 myapp.{yaml,yml,toml,json} 配置文件
let config: AppConfig = auto_load_config(\"myapp\", Some(\"APP\"))?;
```

## 配置文件格式


### YAML 格式 (`config.yaml`)


```yaml
name: \"my-application\"
port: 8080
debug: false
database:
  host: \"localhost\"
  port: 5432
  username: \"postgres\"
  password: \"password\"
```

### TOML 格式 (`config.toml`)


```toml
name = \"my-application\"
port = 8080
debug = false

[database]
host = \"localhost\"
port = 5432
username = \"postgres\"
password = \"password\"
```

### JSON 格式 (`config.json`)


```json
{
  \"name\": \"my-application\",
  \"port\": 8080,
  \"debug\": false,
  \"database\": {
    \"host\": \"localhost\",
    \"port\": 5432,
    \"username\": \"postgres\",
    \"password\": \"password\"
  }
}
```

## 环境变量规则


环境变量遵循以下命名规则:

- 前缀:通过 `with_env_prefix()` 设置(如 `APP`- 分隔符:通过 `with_env_separator()` 设置(默认 `__`- 嵌套:使用分隔符表示嵌套结构

例如,对于配置:
```yaml
port: 8080
database:
  host: \"localhost\"
  port: 5432
```

对应的环境变量为:
```bash
APP_PORT=9000
APP_DATABASE__HOST=db.example.com
APP_DATABASE__PORT=3306
```

## 配置优先级


配置值的优先级从高到低:

1. 🌍 **环境变量** - 最高优先级
2. 📄 **后加载的配置文件** - 覆盖先加载的文件
3. 📄 **先加载的配置文件**
4. ⚙️ **默认值** - 最低优先级

## 错误处理


配置模块使用统一的错误类型:

- `ConfigLoadError` - 配置加载错误
- `ConfigFileNotFoundError` - 配置文件不存在
- `ConfigParseError` - 配置解析错误
- `ConfigValidationError` - 配置验证错误
- `EnvVarParseError` - 环境变量解析错误

## 高级用法


### 配置验证


```rust
#[derive(Debug, Serialize, Deserialize)]

struct AppConfig {
    #[serde(deserialize_with = \"validate_port\")]
    port: u16,
    // 其他字段...
}

fn validate_port<'de, D>(deserializer: D) -> Result<u16, D::Error>
where
    D: serde::Deserializer<'de>,
{
    let port: u16 = u16::deserialize(deserializer)?;
    if port < 1024 {
        return Err(serde::de::Error::custom(\"端口号必须大于等于1024\"));
    }
    Ok(port)
}
```

### 可选配置项


```rust
#[derive(Debug, Serialize, Deserialize)]

struct AppConfig {
    name: String,
    port: u16,
    // 可选的 Redis 配置
    redis: Option<RedisConfig>,
    // 带默认值的配置
    #[serde(default = \"default_timeout\")]
    timeout: u64,
}

fn default_timeout() -> u64 {
    30
}
```

### 自定义配置路径


```rust
use clamber_core::get_config_paths;

// 获取应用 \"myapp\" 的所有可能配置路径
let paths = get_config_paths(\"myapp\");
for path in paths {
    println!(\"检查配置文件: {:?}\", path);
}
```

## 示例


查看 `examples/config_example.rs` 了解完整的使用示例,包括:

- 基础配置加载
- 环境变量覆盖
- 多文件合并
- 自动发现
- 不同格式支持

运行示例:
```bash
cargo run --example config_example
```