flare_core/common/error/
builder.rs1use super::code::ErrorCode;
4use super::flare_error::FlareError;
5use super::localized::LocalizedError;
6use std::collections::HashMap;
7
8pub struct ErrorBuilder {
10 code: ErrorCode,
11 reason: String,
12 details: Option<String>,
13 params: Option<HashMap<String, String>>,
14}
15
16impl ErrorBuilder {
17 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 #[must_use]
29 pub fn details(mut self, details: impl Into<String>) -> Self {
30 self.details = Some(details.into());
31 self
32 }
33
34 #[must_use]
36 pub fn params(mut self, params: HashMap<String, String>) -> Self {
37 self.params = Some(params);
38 self
39 }
40
41 #[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 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 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}