error_handling/
error_handling.rs1use clamber_core::{
2 ClamberError, JwtConfig, JwtManager, Result, generate_token, is_valid_token, verify_token,
3};
4use serde::{Deserialize, Serialize};
5
6#[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 example_jwt_error_handling()?;
20
21 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 let empty_config = JwtConfig::new("", 7); 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 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 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 let token = generate_token(&user, JwtConfig::default()).map_err(|e| {
96 println!(" 生成token失败: {}", e);
97 e
98 })?;
99
100 println!(" ✓ 成功生成token");
101
102 if is_valid_token(&token) {
104 println!(" ✓ Token有效性验证通过");
105 } else {
106 println!(" ✗ Token无效");
107 }
108
109 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
125fn demonstrate_error_handling_patterns() {
127 println!(" 演示不同的错误处理模式:");
128
129 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 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 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}