Skip to main content

flare_core/common/error/
builder.rs

1//! 错误构建器
2
3use super::code::ErrorCode;
4use super::flare_error::FlareError;
5use super::localized::LocalizedError;
6use std::collections::HashMap;
7
8/// 错误构建器 - 提供链式 API 构建复杂错误
9pub struct ErrorBuilder {
10    code: ErrorCode,
11    reason: String,
12    details: Option<String>,
13    params: Option<HashMap<String, String>>,
14}
15
16impl ErrorBuilder {
17    /// 创建新的错误构建器
18    pub fn new(code: ErrorCode, reason: impl Into<String>) -> Self {
19        Self {
20            code,
21            reason: reason.into(),
22            details: None,
23            params: None,
24        }
25    }
26
27    /// 添加错误详情
28    #[must_use]
29    pub fn details(mut self, details: impl Into<String>) -> Self {
30        self.details = Some(details.into());
31        self
32    }
33
34    /// 添加错误参数
35    #[must_use]
36    pub fn params(mut self, params: HashMap<String, String>) -> Self {
37        self.params = Some(params);
38        self
39    }
40
41    /// 添加单个参数
42    #[must_use]
43    pub fn param(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
44        if self.params.is_none() {
45            self.params = Some(HashMap::new());
46        }
47        if let Some(ref mut params) = self.params {
48            params.insert(key.into(), value.into());
49        }
50        self
51    }
52
53    /// 构建错误
54    pub fn build(self) -> FlareError {
55        FlareError::Localized {
56            code: self.code,
57            reason: self.reason,
58            details: self.details,
59            params: self.params,
60            timestamp: chrono::Utc::now(),
61        }
62    }
63
64    /// 构建为 LocalizedError
65    pub fn build_localized(self) -> LocalizedError {
66        let mut localized = LocalizedError::new(self.code, self.reason);
67        if let Some(details) = self.details {
68            localized = localized.with_details(details);
69        }
70        if let Some(params) = self.params {
71            localized = localized.with_params(params);
72        }
73        localized
74    }
75}