diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 00000000..4e48c1c1 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-05-18 - Avoid unnecessary allocations when applying casing rules +**Learning:** Found string formatting logic in `xdk-lib/src/casing.rs` causing intermediate allocations. E.g., `words.iter().map(|w| pascal_case(w)).collect::>().join("")` creates an unnecessary `Vec` allocation before `.join("")` and can be simplified using an iterator structure like string concatenation. Similarly, converting a char to a lowercase string should not use `collect::()` when `to_string()` avoids iterator overhead. +**Action:** Replace `collect::>().join("")` with `fold` or looping to avoid creating intermediate `Vec` instances. Replace `.to_lowercase().collect::()` with `.to_lowercase().to_string()`. diff --git a/xdk-lib/src/casing.rs b/xdk-lib/src/casing.rs index 6463487e..bd04c567 100644 --- a/xdk-lib/src/casing.rs +++ b/xdk-lib/src/casing.rs @@ -29,11 +29,7 @@ impl Casing { result } } - Casing::Pascal => words - .iter() - .map(|w| pascal_case(w)) - .collect::>() - .join(""), + Casing::Pascal => words.iter().map(|w| pascal_case(w)).collect::(), Casing::Kebab => words.join("-").to_lowercase(), Casing::ScreamingSnake => words.join("_").to_uppercase(), } @@ -118,6 +114,6 @@ pub fn camel_case(value: &str) -> String { let mut chars = pascal.chars(); match chars.next() { None => String::new(), - Some(first) => first.to_lowercase().collect::() + chars.as_str(), + Some(first) => first.to_lowercase().to_string() + chars.as_str(), } }