13
13
// limitations under the License.
14
14
15
15
use std:: collections:: HashMap ;
16
+ use std:: fmt:: Display ;
16
17
use std:: ops:: RangeInclusive ;
17
18
use std:: sync:: Arc ;
18
19
@@ -43,6 +44,15 @@ pub enum SettingRange {
43
44
String ( Vec < & ' static str > ) ,
44
45
}
45
46
47
+ impl Display for SettingRange {
48
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
49
+ match self {
50
+ SettingRange :: Numeric ( range) => write ! ( f, "[{}, {}]" , range. start( ) , range. end( ) ) ,
51
+ SettingRange :: String ( values) => write ! ( f, "{:?}" , values) ,
52
+ }
53
+ }
54
+ }
55
+
46
56
impl SettingRange {
47
57
/// Checks if an integer value is within the numeric range.
48
58
pub fn is_within_numeric_range ( & self , value : u64 ) -> Result < ( ) > {
@@ -51,11 +61,9 @@ impl SettingRange {
51
61
if range. contains ( & value) {
52
62
Ok ( ( ) )
53
63
} else {
54
- Err ( ErrorCode :: BadArguments ( format ! (
55
- "Value {} is not within the range [{}, {}]" ,
56
- value,
57
- range. start( ) ,
58
- range. end( )
64
+ Err ( ErrorCode :: WrongValueForVariable ( format ! (
65
+ "Value {} is not within the range {}" ,
66
+ value, self
59
67
) ) )
60
68
}
61
69
}
@@ -71,9 +79,9 @@ impl SettingRange {
71
79
SettingRange :: String ( values) => {
72
80
match values. iter ( ) . find ( |& s| s. eq_ignore_ascii_case ( value) ) {
73
81
Some ( s) => Ok ( s. to_string ( ) ) ,
74
- None => Err ( ErrorCode :: BadArguments ( format ! (
75
- "Value {} is not within the allowed values {:? }" ,
76
- value, values
82
+ None => Err ( ErrorCode :: WrongValueForVariable ( format ! (
83
+ "Value {} is not within the allowed values {:}" ,
84
+ value, self
77
85
) ) ) ,
78
86
}
79
87
}
@@ -697,10 +705,7 @@ impl DefaultSettings {
697
705
match setting_value. value {
698
706
// Numeric value.
699
707
UserSettingValue :: UInt64 ( _) => {
700
- let u64_val = v. parse :: < u64 > ( ) . map_err ( |_| {
701
- ErrorCode :: BadArguments ( format ! ( "{} is not a valid integer value" , v) )
702
- } ) ?;
703
-
708
+ let u64_val = Self :: parse_to_u64 ( & v) ?;
704
709
Ok ( ( k, UserSettingValue :: UInt64 ( u64_val) ) )
705
710
}
706
711
// String value.
@@ -711,9 +716,7 @@ impl DefaultSettings {
711
716
match range {
712
717
// Numeric range.
713
718
SettingRange :: Numeric ( _) => {
714
- let u64_val = v. parse :: < u64 > ( ) . map_err ( |_| {
715
- ErrorCode :: BadArguments ( format ! ( "{} is not a valid integer value" , v) )
716
- } ) ?;
719
+ let u64_val = Self :: parse_to_u64 ( & v) ?;
717
720
range. is_within_numeric_range ( u64_val) ?;
718
721
719
722
Ok ( ( k, UserSettingValue :: UInt64 ( u64_val) ) )
@@ -730,6 +733,26 @@ impl DefaultSettings {
730
733
}
731
734
}
732
735
736
+ /// Parses a string value to u64.
737
+ /// If the value is not a valid u64, it will be parsed as f64.
738
+ /// Used for:
739
+ /// set max_memory_usage = 1024*1024*1024*1.5;
740
+ fn parse_to_u64 ( v : & str ) -> Result < u64 > {
741
+ match v. parse :: < u64 > ( ) {
742
+ Ok ( val) => Ok ( val) , // If it's a valid u64, use it
743
+ Err ( _) => {
744
+ // If not a valid u64, try parsing as f64
745
+ match v. parse :: < f64 > ( ) {
746
+ Ok ( f) if f. fract ( ) == 0.0 && f >= 0.0 => Ok ( f. trunc ( ) as u64 ) , /* Convert to u64 if no fractional part and non-negative */
747
+ _ => Err ( ErrorCode :: WrongValueForVariable ( format ! (
748
+ "{} is not a valid integer value" ,
749
+ v
750
+ ) ) ) ,
751
+ }
752
+ }
753
+ }
754
+ }
755
+
733
756
pub fn try_get_u64 ( key : & str ) -> Result < u64 > {
734
757
match DefaultSettings :: instance ( ) ?. settings . get ( key) {
735
758
Some ( v) => v. value . as_u64 ( ) ,
0 commit comments