devcycle_bucketing_rs/util/
errors.rs

1use crate::events::event::DefaultReason;
2use std::error::Error;
3use std::fmt;
4
5#[derive(Debug)]
6pub struct DevCycleError {
7    pub(crate) details: String,
8}
9
10impl DevCycleError {
11    pub fn new(msg: &str) -> DevCycleError {
12        DevCycleError {
13            details: msg.to_string(),
14        }
15    }
16}
17
18impl fmt::Display for DevCycleError {
19    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20        write!(f, "{}", self.details)
21    }
22}
23
24impl Error for DevCycleError {
25    fn description(&self) -> &str {
26        &self.details
27    }
28}
29
30pub const FAILED_TO_DECIDE_VARIATION: DevCycleError = DevCycleError {
31    details: String::new(),
32};
33pub const FAILED_USER_DOES_NOT_QUALIFY_FOR_TARGETS: DevCycleError = DevCycleError {
34    details: String::new(),
35};
36pub const FAILED_USER_DOES_NOT_QUALIFY_FOR_ROLLOUTS: DevCycleError = DevCycleError {
37    details: String::new(),
38};
39pub const MISSING_VARIABLE: DevCycleError = DevCycleError {
40    details: String::new(),
41};
42pub const MISSING_VARIATION: DevCycleError = DevCycleError {
43    details: String::new(),
44};
45
46// Helper functions to create errors with proper messages
47pub(crate) fn failed_to_decide_variation() -> DevCycleError {
48    DevCycleError::new("Failed to decide target variation")
49}
50
51pub(crate) fn failed_user_does_not_qualify_for_targets() -> DevCycleError {
52    DevCycleError::new("User does not qualify for any targets")
53}
54
55pub(crate) fn failed_user_does_not_qualify_for_rollouts() -> DevCycleError {
56    DevCycleError::new("User does not qualify for rollouts")
57}
58
59pub(crate) fn missing_variable() -> DevCycleError {
60    DevCycleError::new("Variable not found")
61}
62
63pub(crate) fn missing_variation() -> DevCycleError {
64    DevCycleError::new("Variation not found")
65}
66
67pub(crate) fn missing_config() -> DevCycleError {
68    DevCycleError::new("Config not found")
69}
70
71pub(crate) fn missing_feature() -> DevCycleError {
72    DevCycleError::new("Feature not found")
73}
74
75pub(crate) fn missing_variable_for_variation() -> DevCycleError {
76    DevCycleError::new("Variable not found for variation")
77}
78
79pub(crate) fn invalid_variable_type() -> DevCycleError {
80    DevCycleError::new("Invalid variable type")
81}
82
83pub(crate) fn variable_type_mismatch() -> DevCycleError {
84    DevCycleError::new("Variable type mismatch")
85}
86
87pub fn failed_to_set_client_custom_data() -> DevCycleError {
88    DevCycleError::new("Failed to set client custom data")
89}
90
91pub fn parse_error(msg: String) -> DevCycleError {
92    DevCycleError::new(&format!("Parse error: {}", msg))
93}
94
95pub fn missing_field(field: String) -> DevCycleError {
96    DevCycleError::new(&format!("Missing required field: {}", field))
97}
98
99pub(crate) fn bucket_result_error_to_default_reason(err: &DevCycleError) -> DefaultReason {
100    match err.details.as_str() {
101        "Missing config" => DefaultReason::MissingConfig,
102        "Missing variable" => DefaultReason::MissingVariable,
103        "Missing feature" => DefaultReason::MissingFeature,
104        "Missing variation" => DefaultReason::MissingVariation,
105        "Missing variable for variation" => DefaultReason::MissingVariableForVariation,
106        "User does not qualify for rollouts" => DefaultReason::UserNotInRollout,
107        "User does not qualify for targets" => DefaultReason::UserNotTargeted,
108        "Invalid variable type" => DefaultReason::InvalidVariableType,
109        "Variable type mismatch" => DefaultReason::VariableTypeMismatch,
110        "" => DefaultReason::NotDefaulted,
111        _ => DefaultReason::Unknown,
112    }
113}
114
115pub(crate) fn event_queue_not_initialized() -> DevCycleError {
116    return DevCycleError::new("Event queue not initialized");
117}