Skip to content

Commit 4f26e07

Browse files
committed
Use strip_prefix/strip_suffix instead of manual slicing
Refactor string parsing to use idiomatic Rust methods: - parse_size: Use strip_suffix for unit detection instead of rfind/split_at - parse_memory_to_mb: Use strip_suffix for G/M/K detection - libvirt/domain: Use strip_prefix for "bridge=" prefix removal This is cleaner, more readable, and follows Rust best practices. Assisted-by: Claude Code (Sonnet 4.5) Signed-off-by: Colin Walters <[email protected]>
1 parent caee64c commit 4f26e07

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

crates/kit/src/libvirt/domain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ impl DomainBuilder {
338338
writer.end_element("interface")?;
339339
}
340340
network if network.starts_with("bridge=") => {
341-
let bridge_name = &network[7..]; // Remove "bridge=" prefix
341+
let bridge_name = network.strip_prefix("bridge=").unwrap();
342342
writer.start_element("interface", &[("type", "bridge")])?;
343343
writer.write_empty_element("source", &[("bridge", bridge_name)])?;
344344
writer.write_empty_element("model", &[("type", "virtio")])?;

crates/kit/src/utils.rs

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)