@@ -106,25 +106,33 @@ pub(crate) fn parse_size(size_str: &str) -> Result<u64> {
106106 return Err ( eyre ! ( "Empty size string" ) ) ;
107107 }
108108
109- let ( number_part, unit_part) = if let Some ( pos) = size_str. rfind ( |c : char | c. is_ascii_digit ( ) ) {
110- let ( num, unit) = size_str. split_at ( pos + 1 ) ;
111- ( num, unit)
109+ // Try to strip known unit suffixes
110+ let ( number_str, multiplier) = if let Some ( num) = size_str. strip_suffix ( "TB" ) {
111+ ( num, 1024_u64 . pow ( 4 ) )
112+ } else if let Some ( num) = size_str. strip_suffix ( "GB" ) {
113+ ( num, 1024 * 1024 * 1024 )
114+ } else if let Some ( num) = size_str. strip_suffix ( "MB" ) {
115+ ( num, 1024 * 1024 )
116+ } else if let Some ( num) = size_str. strip_suffix ( "KB" ) {
117+ ( num, 1024 )
118+ } else if let Some ( num) = size_str. strip_suffix ( 'T' ) {
119+ ( num, 1024_u64 . pow ( 4 ) )
120+ } else if let Some ( num) = size_str. strip_suffix ( 'G' ) {
121+ ( num, 1024 * 1024 * 1024 )
122+ } else if let Some ( num) = size_str. strip_suffix ( 'M' ) {
123+ ( num, 1024 * 1024 )
124+ } else if let Some ( num) = size_str. strip_suffix ( 'K' ) {
125+ ( num, 1024 )
126+ } else if let Some ( num) = size_str. strip_suffix ( 'B' ) {
127+ ( num, 1 )
112128 } else {
113- return Err ( eyre ! ( "Invalid size format: {}" , size_str) ) ;
129+ // No unit suffix, assume bytes
130+ ( & * size_str, 1 )
114131 } ;
115132
116- let number: u64 = number_part
133+ let number: u64 = number_str
117134 . parse ( )
118- . map_err ( |_| eyre ! ( "Invalid number in size: {}" , number_part) ) ?;
119-
120- let multiplier = match unit_part {
121- "" | "B" => 1 ,
122- "K" | "KB" => 1024 ,
123- "M" | "MB" => 1024 * 1024 ,
124- "G" | "GB" => 1024 * 1024 * 1024 ,
125- "T" | "TB" => 1024_u64 . pow ( 4 ) ,
126- _ => return Err ( eyre ! ( "Unknown size unit: {}" , unit_part) ) ,
127- } ;
135+ . map_err ( |_| eyre ! ( "Invalid number in size: {}" , number_str) ) ?;
128136
129137 Ok ( number * multiplier)
130138}
@@ -137,17 +145,25 @@ pub(crate) fn parse_memory_to_mb(memory_str: &str) -> Result<u32> {
137145 return Err ( eyre ! ( "Memory string cannot be empty" ) ) ;
138146 }
139147
140- // Check if it ends with a unit suffix
141- let last_char = memory_str
142- . chars ( )
143- . last ( )
144- . ok_or_else ( || eyre ! ( "Memory specification cannot be empty" ) ) ?;
145-
146- let ( number_str, unit) = match last_char. to_ascii_uppercase ( ) {
147- 'G' => ( & memory_str[ ..memory_str. len ( ) - 1 ] , "GiB" ) ,
148- 'M' => ( & memory_str[ ..memory_str. len ( ) - 1 ] , "MiB" ) ,
149- 'K' => ( & memory_str[ ..memory_str. len ( ) - 1 ] , "KiB" ) ,
150- _ => ( memory_str, "MiB" ) , // No suffix, assume megabytes
148+ // Try to strip unit suffix, checking case-insensitively
149+ let ( number_str, unit) = if let Some ( num) = memory_str
150+ . strip_suffix ( 'G' )
151+ . or_else ( || memory_str. strip_suffix ( 'g' ) )
152+ {
153+ ( num, "GiB" )
154+ } else if let Some ( num) = memory_str
155+ . strip_suffix ( 'M' )
156+ . or_else ( || memory_str. strip_suffix ( 'm' ) )
157+ {
158+ ( num, "MiB" )
159+ } else if let Some ( num) = memory_str
160+ . strip_suffix ( 'K' )
161+ . or_else ( || memory_str. strip_suffix ( 'k' ) )
162+ {
163+ ( num, "KiB" )
164+ } else {
165+ // No suffix, assume megabytes
166+ ( memory_str, "MiB" )
151167 } ;
152168
153169 let number: f64 = number_str
0 commit comments