error_handling/
error_handling.rs

1use clamber_core::{
2    ClamberError, JwtConfig, JwtManager, Result, generate_token, is_valid_token, verify_token,
3};
4use serde::{Deserialize, Serialize};
5
6// 定义用户结构体
7#[derive(Debug, Serialize, Deserialize, PartialEq)]
8struct User {
9    id: String,
10    username: String,
11    email: String,
12    role: String,
13}
14
15fn main() -> Result<()> {
16    println!("=== Clamber Core 错误处理示例 ===\n");
17
18    // 示例1:JWT错误处理
19    example_jwt_error_handling()?;
20
21    // 示例2:成功案例
22    example_success_case()?;
23
24    println!("4. 错误处理最佳实践示例:");
25    demonstrate_error_handling_patterns();
26
27    Ok(())
28}
29
30fn example_jwt_error_handling() -> Result<()> {
31    println!("1. JWT错误处理:");
32
33    // 测试无效密钥
34    let empty_config = JwtConfig::new("", 7); // 空密钥
35    let manager = JwtManager::new(empty_config);
36
37    let user = User {
38        id: "123".to_string(),
39        username: "test_user".to_string(),
40        email: "test@example.com".to_string(),
41        role: "user".to_string(),
42    };
43
44    match manager.generate_token(&user) {
45        Ok(_) => println!("   意外:空密钥应该失败"),
46        Err(ClamberError::JwtKeyError { details }) => {
47            println!("   ✓ 正确检测到密钥错误: {}", details);
48        }
49        Err(e) => println!("   ? 其他错误: {}", e),
50    }
51
52    // 测试无效token验证
53    let valid_config = JwtConfig::new("valid_secret", 7);
54    let valid_manager = JwtManager::new(valid_config);
55
56    match valid_manager.verify_token::<User>("invalid.jwt.token") {
57        Ok(_) => println!("   意外:无效token应该失败"),
58        Err(ClamberError::JwtVerifyError { details }) => {
59            println!("   ✓ 正确检测到JWT验证错误: {}", details);
60        }
61        Err(e) => println!("   ? 其他JWT错误: {}", e),
62    }
63
64    // 测试不同类型的错误处理
65    let config1 = JwtConfig::new("secret1", 7);
66    let config2 = JwtConfig::new("secret2", 7);
67    let manager1 = JwtManager::new(config1);
68    let manager2 = JwtManager::new(config2);
69
70    let token = manager1.generate_token(&user)?;
71
72    match manager2.verify_token::<User>(&token) {
73        Ok(_) => println!("   意外:不同密钥应该失败"),
74        Err(ClamberError::JwtVerifyError { details }) => {
75            println!("   ✓ 正确检测到密钥不匹配: {}", details);
76        }
77        Err(e) => println!("   ? 其他错误: {}", e),
78    }
79
80    println!();
81    Ok(())
82}
83
84fn example_success_case() -> Result<()> {
85    println!("2. 成功案例:");
86
87    let user = User {
88        id: "456".to_string(),
89        username: "success_user".to_string(),
90        email: "success@example.com".to_string(),
91        role: "admin".to_string(),
92    };
93
94    // 使用便利函数
95    let token = generate_token(&user, JwtConfig::default()).map_err(|e| {
96        println!("   生成token失败: {}", e);
97        e
98    })?;
99
100    println!("   ✓ 成功生成token");
101
102    // 检查有效性
103    if is_valid_token(&token) {
104        println!("   ✓ Token有效性验证通过");
105    } else {
106        println!("   ✗ Token无效");
107    }
108
109    // 验证并解析
110    let decoded_user: User = verify_token(&token).map_err(|e| {
111        println!("   验证token失败: {}", e);
112        e
113    })?;
114
115    println!("   ✓ 成功验证并解析token");
116    println!("   ✓ 用户数据: {:?}", decoded_user);
117
118    assert_eq!(user, decoded_user);
119    println!("   ✓ 数据一致性验证通过");
120
121    println!();
122    Ok(())
123}
124
125// 展示如何在实际应用中处理错误
126fn demonstrate_error_handling_patterns() {
127    println!("   演示不同的错误处理模式:");
128
129    // 模式1:具体错误类型处理
130    println!("\n   模式1:具体错误类型匹配");
131    let invalid_token = "invalid.token";
132    match verify_token::<User>(invalid_token) {
133        Ok(user) => println!("   用户验证成功: {:?}", user),
134        Err(ClamberError::JwtExpiredError) => {
135            println!("   → Token已过期,请重新登录");
136        }
137        Err(ClamberError::JwtVerifyError { details }) => {
138            println!("   → Token验证失败: {}", details);
139        }
140        Err(ClamberError::JwtMissingFieldError { field }) => {
141            println!("   → Token格式错误,缺少字段: {}", field);
142        }
143        Err(ClamberError::DeserializationError { details }) => {
144            println!("   → 数据格式错误: {}", details);
145        }
146        Err(e) => {
147            println!("   → 未知错误: {}", e);
148        }
149    }
150
151    // 模式2:错误传播
152    println!("\n   模式2:错误传播(? 操作符)");
153    let result = (|| -> Result<()> {
154        let user = User {
155            id: "test".to_string(),
156            username: "test".to_string(),
157            email: "test@example.com".to_string(),
158            role: "user".to_string(),
159        };
160        let token = generate_token(&user, JwtConfig::default())?;
161        let _decoded: User = verify_token(&token)?;
162        Ok(())
163    })();
164
165    match result {
166        Ok(()) => println!("   ✓ 操作序列成功完成"),
167        Err(e) => println!("   ✗ 操作序列失败: {}", e),
168    }
169
170    // 模式3:错误转换和上下文
171    println!("\n   模式3:错误上下文处理");
172    let result = (|| -> Result<String> {
173        let config = JwtConfig::new("test_secret", 1);
174        let manager = JwtManager::new(config);
175
176        let user = User {
177            id: "context_test".to_string(),
178            username: "context_user".to_string(),
179            email: "context@example.com".to_string(),
180            role: "user".to_string(),
181        };
182
183        manager.generate_token(&user)
184    })();
185
186    match result {
187        Ok(token) => println!("   ✓ 生成token成功: {}...", &token[..20]),
188        Err(e) => println!("   ✗ 生成token失败: {}", e),
189    }
190
191    println!("\n   ✓ 错误处理模式演示完成");
192}