rocketmq_model/common/attribute/
long_range_attribute.rs1use cheetah_string::CheetahString;
30
31use crate::common::attribute::Attribute;
32use crate::common::attribute::AttributeBase;
33
34#[derive(Debug, Clone)]
35pub struct LongRangeAttribute {
36 attribute: AttributeBase,
37 min: i64,
39
40 max: i64,
42
43 default_value: i64,
45}
46
47impl LongRangeAttribute {
48 pub fn new(name: CheetahString, changeable: bool, min: i64, max: i64, default_value: i64) -> Self {
63 Self {
64 attribute: AttributeBase::new(name, changeable),
65 min,
66 max,
67 default_value,
68 }
69 }
70
71 #[inline]
73 pub fn default_value(&self) -> i64 {
74 self.default_value
75 }
76
77 pub fn min(&self) -> i64 {
79 self.min
80 }
81
82 pub fn max(&self) -> i64 {
84 self.max
85 }
86
87 pub fn parse_long(value: &str) -> Result<i64, String> {
89 value.parse::<i64>().map_err(|e| format!("Invalid integer format: {e}"))
90 }
91}
92
93impl Attribute for LongRangeAttribute {
94 fn verify(&self, value: &str) -> Result<(), String> {
95 let parsed_value = Self::parse_long(value)?;
97
98 if parsed_value < self.min || parsed_value > self.max {
100 return Err(format!(
101 "Value {} is not in range [{}, {}]",
102 parsed_value, self.min, self.max
103 ));
104 }
105
106 Ok(())
107 }
108
109 #[inline]
110 fn name(&self) -> &CheetahString {
111 self.attribute.name()
112 }
113
114 #[inline]
115 fn is_changeable(&self) -> bool {
116 self.attribute.is_changeable()
117 }
118}
119
120#[cfg(test)]
121mod tests {
122 use cheetah_string::CheetahString;
123
124 use super::*;
125
126 #[test]
127 fn create_long_range_attribute() {
128 let name = CheetahString::from_static_str("test_attribute");
129 let attribute = LongRangeAttribute::new(name.clone(), true, 0, 100, 50);
130 assert_eq!(attribute.name(), &name);
131 assert!(attribute.is_changeable());
132 assert_eq!(attribute.default_value(), 50);
133 }
134
135 #[test]
136 fn parse_long_valid() {
137 let result = LongRangeAttribute::parse_long("42");
138 assert!(result.is_ok());
139 assert_eq!(result.unwrap(), 42);
140 }
141
142 #[test]
143 fn parse_long_invalid() {
144 let result = LongRangeAttribute::parse_long("invalid");
145 assert!(result.is_err());
146 assert_eq!(
147 result.unwrap_err(),
148 "Invalid integer format: invalid digit found in string"
149 );
150 }
151
152 #[test]
153 fn verify_value_in_range() {
154 let attribute = LongRangeAttribute::new(CheetahString::from_static_str("test_attribute"), true, 0, 100, 50);
155 let result = attribute.verify("42");
156 assert!(result.is_ok());
157 }
158
159 #[test]
160 fn verify_value_below_range() {
161 let attribute = LongRangeAttribute::new(CheetahString::from_static_str("test_attribute"), true, 0, 100, 50);
162 let result = attribute.verify("-1");
163 assert!(result.is_err());
164 assert_eq!(result.unwrap_err(), "Value -1 is not in range [0, 100]");
165 }
166
167 #[test]
168 fn verify_value_above_range() {
169 let attribute = LongRangeAttribute::new(CheetahString::from_static_str("test_attribute"), true, 0, 100, 50);
170 let result = attribute.verify("101");
171 assert!(result.is_err());
172 assert_eq!(result.unwrap_err(), "Value 101 is not in range [0, 100]");
173 }
174}