use clamber_core::{
ClamberError, JwtConfig, JwtManager, Result, generate_token, is_valid_token, verify_token,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct User {
id: String,
username: String,
email: String,
role: String,
}
fn main() -> Result<()> {
println!("=== Clamber Core 错误处理示例 ===\n");
example_jwt_error_handling()?;
example_success_case()?;
println!("4. 错误处理最佳实践示例:");
demonstrate_error_handling_patterns();
Ok(())
}
fn example_jwt_error_handling() -> Result<()> {
println!("1. JWT错误处理:");
let empty_config = JwtConfig::new("", 7); let manager = JwtManager::new(empty_config);
let user = User {
id: "123".to_string(),
username: "test_user".to_string(),
email: "test@example.com".to_string(),
role: "user".to_string(),
};
match manager.generate_token(&user) {
Ok(_) => println!(" 意外:空密钥应该失败"),
Err(ClamberError::JwtKeyError { details }) => {
println!(" ✓ 正确检测到密钥错误: {}", details);
}
Err(e) => println!(" ? 其他错误: {}", e),
}
let valid_config = JwtConfig::new("valid_secret", 7);
let valid_manager = JwtManager::new(valid_config);
match valid_manager.verify_token::<User>("invalid.jwt.token") {
Ok(_) => println!(" 意外:无效token应该失败"),
Err(ClamberError::JwtVerifyError { details }) => {
println!(" ✓ 正确检测到JWT验证错误: {}", details);
}
Err(e) => println!(" ? 其他JWT错误: {}", e),
}
let config1 = JwtConfig::new("secret1", 7);
let config2 = JwtConfig::new("secret2", 7);
let manager1 = JwtManager::new(config1);
let manager2 = JwtManager::new(config2);
let token = manager1.generate_token(&user)?;
match manager2.verify_token::<User>(&token) {
Ok(_) => println!(" 意外:不同密钥应该失败"),
Err(ClamberError::JwtVerifyError { details }) => {
println!(" ✓ 正确检测到密钥不匹配: {}", details);
}
Err(e) => println!(" ? 其他错误: {}", e),
}
println!();
Ok(())
}
fn example_success_case() -> Result<()> {
println!("2. 成功案例:");
let user = User {
id: "456".to_string(),
username: "success_user".to_string(),
email: "success@example.com".to_string(),
role: "admin".to_string(),
};
let token = generate_token(&user, JwtConfig::default()).map_err(|e| {
println!(" 生成token失败: {}", e);
e
})?;
println!(" ✓ 成功生成token");
if is_valid_token(&token) {
println!(" ✓ Token有效性验证通过");
} else {
println!(" ✗ Token无效");
}
let decoded_user: User = verify_token(&token).map_err(|e| {
println!(" 验证token失败: {}", e);
e
})?;
println!(" ✓ 成功验证并解析token");
println!(" ✓ 用户数据: {:?}", decoded_user);
assert_eq!(user, decoded_user);
println!(" ✓ 数据一致性验证通过");
println!();
Ok(())
}
fn demonstrate_error_handling_patterns() {
println!(" 演示不同的错误处理模式:");
println!("\n 模式1:具体错误类型匹配");
let invalid_token = "invalid.token";
match verify_token::<User>(invalid_token) {
Ok(user) => println!(" 用户验证成功: {:?}", user),
Err(ClamberError::JwtExpiredError) => {
println!(" → Token已过期,请重新登录");
}
Err(ClamberError::JwtVerifyError { details }) => {
println!(" → Token验证失败: {}", details);
}
Err(ClamberError::JwtMissingFieldError { field }) => {
println!(" → Token格式错误,缺少字段: {}", field);
}
Err(ClamberError::DeserializationError { details }) => {
println!(" → 数据格式错误: {}", details);
}
Err(e) => {
println!(" → 未知错误: {}", e);
}
}
println!("\n 模式2:错误传播(? 操作符)");
let result = (|| -> Result<()> {
let user = User {
id: "test".to_string(),
username: "test".to_string(),
email: "test@example.com".to_string(),
role: "user".to_string(),
};
let token = generate_token(&user, JwtConfig::default())?;
let _decoded: User = verify_token(&token)?;
Ok(())
})();
match result {
Ok(()) => println!(" ✓ 操作序列成功完成"),
Err(e) => println!(" ✗ 操作序列失败: {}", e),
}
println!("\n 模式3:错误上下文处理");
let result = (|| -> Result<String> {
let config = JwtConfig::new("test_secret", 1);
let manager = JwtManager::new(config);
let user = User {
id: "context_test".to_string(),
username: "context_user".to_string(),
email: "context@example.com".to_string(),
role: "user".to_string(),
};
manager.generate_token(&user)
})();
match result {
Ok(token) => println!(" ✓ 生成token成功: {}...", &token[..20]),
Err(e) => println!(" ✗ 生成token失败: {}", e),
}
println!("\n ✓ 错误处理模式演示完成");
}